node.js - 获取 Http 响应 NodeJS
问题描述
尝试在 NodeJS(nodeJs 的新手)中执行 AWS Lambda,我在其中发出 http 请求。在 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);
};
拉姆达代码:
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);
}
我希望返回 response.statusCode 和 response.statusMessage 作为 Lambda 的响应
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);
}
解决方案
问题是您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);
});
推荐阅读
- c++ - 检查登录Windows的用户名是否与运行程序的用户名相同 - C++
- vb.net - 使用 OWIN/MSAL 的 WebForms 应用程序未收到授权码
- javascript - 在js中将SVG与底层JPEG结合到画布中
- api - DB2 SYSTOOLS.HTTPPUTCLOB 在第三个参数 REQUESTMSG(正文?)中忽略 JSON
- html - Bootstrap 4:下拉菜单不起作用编辑:在 firefox 中
- google-chrome - 即使使用对象,Chrome 也会显示 frame-src 错误
- asp.net - 登录后 ASP.net 应用程序绕道到 IIS.net 网页
- c# - 如何将 ASP .NET Identity/Identity Framework DbContext 类合并到另一个 Assembly/Project 上的 DbContext 类
- helper - 如何计算二维表中的总数?
- reactjs - 在 VS Code 扩展 web 视图中发出 GET 请求时出现证书错误