【问题标题】:AWS Lambda get data from external public API (basic)AWS Lambda 从外部公共 API 获取数据(基本)
【发布时间】:2019-10-13 05:40:10
【问题描述】:

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

【问题讨论】:

    标签: node.js aws-lambda


    【解决方案1】:

    下面的代码正在运行

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

    【讨论】:

      【解决方案2】:

      您的代码存在一些问题:

      传递给处理程序的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();
      };
      

      【讨论】:

      • 此代码无效。能详细点吗?
      • 谢谢,我现在没有收到错误消息。但是,我没有从 API 中获取 JSON。所以我们更接近了。
      • 看起来 https.request 是一个相当低级的调用 (nodejs.org/api/https.html#https_https_request_options_callback) - 你必须调用 request.on('data', d => {}) 才能获得实际内容。不过,您应该能够在 AWS Lambda 之外测试您的那部分代码,因为那时它只是节点。
      • 我仍然无法取回 json 数据。有没有更好的方法使用 AWS Lambda 从 API 获取数据? (使用 AWS 在线代码编辑器)?
      猜你喜欢
      • 2012-02-25
      • 2017-07-06
      • 2022-10-23
      • 1970-01-01
      • 2011-03-16
      • 2020-06-25
      • 1970-01-01
      • 2015-08-16
      相关资源
      最近更新 更多