AWS Lambda从外部公共API(基本)获取数据



我正在尝试编写一个简单的AWS lambda函数,以从外部公共API中检索数据。我在互联网上复制并粘贴了代码,没有任何运气。

我已经删除了代码,以使其简单地保持简单。公共API是:https://swapi.co/api/people/1/

如何从公共API中获取数据?

const https = require('https');
exports.handler = async (event) => {
    var options = {
      method: 'GET',
      host: 'https://swapi.co/api/people/1/',
    };
     console.log('options', options);
     const req = https.request(options, (res) => {
         console.log('statusCode: ${res.statusCode}')
         console.log(JSON.stringify(res))
     });

    // TODO implement
    const response = {
        statusCode: 200,
        body: JSON.stringify('Hello from Lambda!'),
    };
    return response;
};

AWS编辑器中的日志文件显示:

START RequestId: 3ba3f23a-11c2-40af-b9e7-0258a6531728 Version: $LATEST
2019-05-27T16:17:44.839Z    3ba3f23a-11c2-40af-b9e7-0258a6531728    INFO    options { method: 'GET', host: 'https://swapi.co/api/people/1/' }
END RequestId: 3ba3f23a-11c2-40af-b9e7-0258a6531728
REPORT RequestId: 3ba3f23a-11c2-40af-b9e7-0258a6531728  Duration: 305.90 ms Billed Duration: 400 ms     Memory Size: 128 MB Max Memory Used: 26 MB  

您的代码有一些问题:

callback函数传递到处理程序中触发执行的末端,或者如果您自己不调用代码,则在代码退出时被要求。我不确定这是如何与异步JavaScript代码相互作用的,但是它可能导致您的代码早期退出,以至于您没有在任何地方打电话。

您使用的是async方法,这是一个很好的做法,但是您的休息电话不是使用它,而是一种回调方法。正如我在下面显示的那样,这可以转换为异步调用,这使代码更容易理解。

我认为最大的问题是您的options是错误的。您在主机开始时不需要https(因为它已经知道该方案(,并且路径不能在主机中。我最初没有发现这个。

这对我有用,尽管您无法在整个响应中调用JSON.stringify,因为它是一个复杂的对象,而不仅仅是模型。

const https = require('https');
exports.handler = async (event, context, callback) => {
    var options = {
        method: 'GET',
        host: 'swapi.co',
        path: '/api/people/1/',
    };
    await new Promise((resolve, reject) => {
        let request = https.request(options, response => {
            try {
                // do whatever
            } finally {
                resolve();
            }
        });
        request.on('error', (e) => reject(e));
        request.end();
    });
    callback();
};

以下代码正在工作

const http = require("https");
exports.handler = async(event, context, callback) => {
  var options = {
    "method": "GET",
    "hostname": "app.casejacket.com",
    "port": null,
    "path": "/api/",
    "headers": {
      "cache-control": "no-cache",
      "Content-Type": "application/json"
    }
  };
  await new Promise((resolve, reject) => {
    console.log('Promise.. ');
    var req = http.request(options, function (res) {
      var chunks = [];
      res.on("data", function (chunk) {
        chunks.push(chunk);
      });
      res.on("end", function () {
        var body = Buffer.concat(chunks);
        let result = JSON.parse(body.toString());
        console.log(body.toString());
        resolve(body.toString());
        callback(null, result)
      });
    });
    req.end();
  });
  callback();
};

最新更新