首页 > 解决方案 > 获取 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);
}

标签: node.jsamazon-web-servicesaws-lambda

解决方案


问题是您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);
 });

推荐阅读