如何在AWS Lambda中使用Nodejs“请求”工作?

use*_*687 1 node.js aws-lambda

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

\n\n

NodeJs 8.10

\n\n
var request = require(\'request\');\n\nmodule.exports.sendcode = async (event) => {\n\n  let options = {\n    url: \'https://api.netease.im/sms/sendcode.action?\' + content, \n    method: \'POST\'\n  };\n\n  return await request(options, function (error, response, body) {\n    console.log(body); \n    return {\n      statusCode: 200,\n      body: JSON.stringify({\n        message: body,\n        input: event,\n      }),\n    };\n  });\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

看起来我的“返回”代码根本没有执行。\n\xef\xbc\x88如果我删除 async 和await,那么程序将挂起直到超时)

\n\n

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

\n

djh*_*eru 5

请求不使用承诺,因此您的await关键字没有执行任何操作。如果您想在请求中使用 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,
    })
  }
};
Run Code Online (Sandbox Code Playgroud)