当我尝试使用“请求”访问外部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的实际响应。
看来我的“返回”代码根本没有执行。 (如果我删除异步并等待,那么程序将挂起直到超时)
任何人都可以帮助您修改此代码以使其正常工作吗?
答案 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