Получить Http Response NodeJS - PullRequest
1 голос
/ 23 мая 2019

Попытка выполнить AWS Lambda в NodeJS (новичок в nodeJs), в котором я делаю http-запрос. В конце выполнения лямбды я хочу вернуть код ответа и ответное сообщение 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);
}

Ответы [ 3 ]

3 голосов
/ 23 мая 2019

Проблема в том, что ваш executeRequest является асинхронным, и ваша лямбда не знает об этом, поэтому он просто сразу же вернется.

Вместо того, чтобы возвращать ответ, передайте его 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 голос
/ 25 мая 2019

Попробуйте что-нибудь подобное.

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 || '');
  });
}
0 голосов
/ 24 мая 2019

Измените свой лямбда-код на следующий,

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);
     });

     } 

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...