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

时间:2019-04-24 04:30:44

标签: node.js aws-lambda

当我尝试使用“请求”访问外部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的实际响应。

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

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

3 个答案:

答案 0 :(得分:2)

请求不使用承诺,因此您的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 (err) {
      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,
    })
  }
};

答案 1 :(得分:1)

您可能会感兴趣,而不是编写您自己的诺言包装,而由同一作者在request-promise上使用诺言包装的request封装。

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

答案 2 :(得分:0)

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

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