获取Http响应NodeJS

时间:2019-05-23 20:36:14

标签: node.js amazon-web-services aws-lambda

尝试在其中发出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);
}

3 个答案:

答案 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 || '');
  });
}