尝试在其中发出http请求的NodeJS(nodeJs的新手)中执行AWS Lambda。 Lambda执行结束时,我希望返回http请求的响应代码和响应消息。
拨打http请求:
var executeRequest = function(request, callback) {
const req = https.request(request, (res) => {
console.log('statusCode:', res.statusCode);
console.log('headers:', res.headers);
res.on('data', (d) => {
process.stdout.write(d);
});
callback(res);
});
req.on('error', (e) => {
console.error(e);
});
req.end(request.body);
};
Lambda代码:
exports.handler = (event, context, callback) => {
// Formulate request
var result = executeRequest(request, function(response) {
console.log("Response Code: ", response.statusCode);
console.log("Response Message: ", response.statusMessage);
// Successfully able to print the response above
return response;
});
console.log("Result Response Code: ", result);
console.log("Result Response Message: ", result);
}
我希望返回Lambda的response.statusCode和response.statusMessage作为响应
return{
statusCode: <the code>,
body: <the message>,
};
但是,结果填充为未定义。如何提取所需的响应参数,以便可以正确返回它们?
**编辑:** 更改后的代码段建议: 使用Promise进行编码:
var executeRequest = function(request, callback) {
return new Promise((resolve, reject) => {
https.request(request, function(res) {
if(res.statusCode==200 || res.statusCode==404) {
resolve(res);
}
else {
console.error(res);
reject(res.statusCode);
}
}).end(request.body || '');
});
};
exports.handler = (event, context, callback) => {
// Formulate request
var value = executeRequest(request).then(function(result) {
console.log("Result ", result);
const response = { statusCode: 200, body: JSON.stringify('Hello from Lambda!') };
return response;
});
console.log(value);
}
答案 0 :(得分:2)
问题是您的executeRequest
是异步的,而您的lambda对此一无所知,因此它会立即返回。
代替返回响应,将其作为第二个参数(第一个是错误对象)传递给callback
callback(null, response)
这部分已执行,无需等待executeRequest
响应,其余代码将被执行
var result = executeRequest(request, function(response) {
console.log("Response Code: ", response.statusCode);
console.log("Response Message: ", response.statusMessage);
// Successfully able to print the response above
return response;
});
所以在这一点上
console.log("Result Response Code: ", result);
console.log("Result Response Message: ", result);
result
仍然为空。
所以您应该改做类似的事情。
var result = executeRequest(request, function(response) {
console.log("Response Code: ", response.statusCode);
console.log("Response Message: ", response.statusMessage);
// Successfully able to print the response above
callback(null, response);
});
答案 1 :(得分:0)
将您的Lambda代码更改为以下内容,
exports.handler = (event, context, callback) => {
// Formulate request
var result = executeRequest(request, function(response) {
console.log("Response Code: ", response.statusCode);
console.log("Response Message: ", response.statusMessage);
// Successfully able to print the response above
callback(null, response);
});
}
希望有帮助。
答案 2 :(得分:0)
尝试类似这样的方法。
exports.handler = function( event, context, callback ) {
//this is to allow function to return as soon as result is shown
context.callbackWaitsForEmptyEventLoop = false;
var request = ...//I expect request is a predefined value or define the request here.
executeRequest(request).then( function( result ) {
//keep all console log before return.
console.log("Result ", result);
const response = { statusCode: 200, body: JSON.stringify('Hello from Lambda!') };
callback(null, response);
return;
});
}
function executeRequest(request){
return new Promise( ( resolve, reject ) => {
https.request(request, function(res) {
if(res.statusCode==200 || res.statusCode==404) {
resolve(res);
}else {
console.error(res);
reject(res.statusCode);
return;
}
}).end(request.body || '');
});
}