【问题标题】:How to use Nodejs "request" work aysn in AWS Lambda?如何在 AWS Lambda 中使用 Nodejs“请求”工作?
【发布时间】:2019-09-13 07:15:39
【问题描述】:

当我尝试使用“请求”访问外部 API 并在 AWS Lambda 中取回响应时,我不知道如何正确放置“返回”代码以返回响应。

NodeJs 8.10

var request = require('request');

module.exports.sendcode = async (event) => {

  let options = {
    url: 'https://api.netease.im/sms/sendcode.action?' + content, 
    method: 'POST'
  };

  return await request(options, function (error, response, body) {
    console.log(body); 
    return {
      statusCode: 200,
      body: JSON.stringify({
        message: body,
        input: event,
      }),
    };
  });
};

当我在无服务器框架中运行这段代码时,我得到一个空响应,正文中没有任何内容,实际上它至少应该有“输入”属性。

但是 console.log 已经记录了 API 的实际响应。

看起来我的“返回”代码根本没有执行。 (如果我删除 async 并等待,那么程序会挂起直到超时)

任何人都可以帮助如何修改此代码以使其正常工作吗?

【问题讨论】:

    标签: node.js aws-lambda


    【解决方案1】:

    请求不使用承诺,因此您的 await 关键字什么也不做。如果你想在 request 中使用 Promise,你需要找到一个支持 Promise 的库,如下所示:https://www.npmjs.com/package/request#promises--asyncawait 一个流行的选项是https://github.com/request/request-promise-native

    但是,简单地将请求包装在一个promise中是一件简单的事情,这样你就不需要使用另一个依赖项

    var request = require('request');
    
    const requestHandler = (options) => new Promise((resolve, reject) => {
      request(options, (error, response, body) => {
        if (error) {
          console.error(error);
          reject(error);
        } else {
          console.log(response, body);
          resolve({ response, body });
        }
      });
    });
    
    module.exports.sendcode = async (event) => {
    
      let options = {
        url: 'https://api.netease.im/sms/sendcode.action?' + content, 
        method: 'POST'
      };
      const { response, body } =  await requestHandler(options);
      return {
        statusCode: 200,
        body: JSON.stringify({
          message: body,
          input: event,
        })
      }
    };
    

    【讨论】:

      【解决方案2】:

      您可能会对request-promise pacakge 与同一作者的request 之上的promise 包装器不同,而不是编写自己的promise 包装器。

      const rp = require('request-promise')
      
      module.exports.sendcode = async (event) => {
      
        let options = {
          url: 'https://api.netease.im/sms/sendcode.action?' + content, 
          method: 'POST'
        };
      
        const body =  await rp(options)
        console.log(body);
        return {
          statusCode: 200,
          body: JSON.stringify({
            message: body,
            input: event,
          }),
        };
      };
      

      如果您想要完整的回复,您只需将resolveWithFullResponse 设置为true

      let options = {
        url: 'https://api.netease.im/sms/sendcode.action?' + content, 
        method: 'POST',
        resolveWithFullResponse: true
      };
      
      // now response contains full respose
      const response =  await rp(options)
      // response.body
      // response.statusCode
      

      【讨论】:

        【解决方案3】:

        将 Async/Await 与 Promise 一起使用。您不能将 Async-Await 语法与回调一起使用。您必须为您的“请求”回调编写一个承诺包装器,或者您可以使用已经可用的请求承诺模块。

        我已经提供了类似问题的答案,您可以在此处参考。 Undefined value after returning an array of values from a MySQL query in a different file

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-03-22
          • 2020-08-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多