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

时间:2019-05-27 16:24:49

标签: node.js aws-lambda

我正在尝试编写一个简单的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  

2 个答案:

答案 0 :(得分:0)

您的代码存在一些问题:

传递到处理程序中的callback函数触发执行的结束,或者如果您自己不调用代码,则在代码退出时为您调用。我不完全确定它如何与异步javascript代码进行交互,但可能是因为您未在任何地方调用它而导致代码提前退出。

您正在使用async方法,这是一个好习惯,但是您的rest调用不是在使用它,而是在使用回调方法。可以将其转换为异步调用,如下所示,这使代码更易于理解。

不过,我认为最大的问题是您的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();
};

答案 1 :(得分:0)

下面的代码有效

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();

};