Попытка выполнить AWS Lambda в NodeJS (новичок в nodeJs), в котором я делаю http-запрос. В конце выполнения Lambda я хочу вернуть код ответа и ответное сообщение HTTP-запроса.
Выполнение вызова http-запроса:
var executeRequest = function(request, callback) {
const req = https.request(request, (res) => {
console.info('statusCode:', res.statusCode);
console.info('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.info("Response Code: ", response.statusCode);
console.info("Response Message: ", response.statusMessage);
// Successfully able to print the response above
return response;
});
console.info("Result Response Code: ", result);
console.info("Result Response Message: ", result);
}
Я хочу вернуть response.statusCode и response.statusMessage в качестве ответа от Lambda.
return{
statusCode: <the code>,
body: <the message>,
};
Однако результат заполняется как неопределенный. Как извлечь требуемый параметр ответа, чтобы его можно было вернуть правильно?
** Редактировать: ** Фрагмент после предложенных изменений: Код с использованием обещания:
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.info("Result ", result);
const response = { statusCode: 200, body: JSON.stringify('Hello from Lambda!') };
return response;
});
console.info(value);
}
@ Каннайян: Result Response Code: undefined Result Response Message: undefined
может быть проще с пакетом npm request.
Переместите строки вашего console.info внутрь функции «результат», иначе они всегда будут неопределенными (поместите их перед return response)





Проблема в том, что ваш executeRequest асинхронный, и ваша лямбда не знает об этом, поэтому он просто вернется сразу.
Вместо того, чтобы возвращать ответ, передайте его callback в качестве второго аргумента (первый — объект ошибки)
callback(null, response)
Эта часть выполняется и, не дожидаясь ответа executeRequest, выполняется остальной код
var result = executeRequest(request, function(response) {
console.info("Response Code: ", response.statusCode);
console.info("Response Message: ", response.statusMessage);
// Successfully able to print the response above
return response;
});
Итак, в этот момент
console.info("Result Response Code: ", result);
console.info("Result Response Message: ", result);
result по-прежнему пуст.
Поэтому вам следует вместо этого сделать что-то вроде этого.
var result = executeRequest(request, function(response) {
console.info("Response Code: ", response.statusCode);
console.info("Response Message: ", response.statusMessage);
// Successfully able to print the response above
callback(null, response);
});
Получение ответа: ReferenceError: обратный вызов не определен
Вам нужно поместить приведенный выше код в тело exports.handler, где определено callback, я обновлю фрагмент кода.
Вероятно, неверно истолковал ваш комментарий. :( ... Я отредактировал свой вопрос, включив в него код, основанный на предложенном ответе, а также распечатанный отчет журнала.
Проблема в асинхронности. Попробуйте использовать промисы.
@ Ханс-Эрик Липпке: У вас есть фрагмент кода, на который я могу сослаться? Я отредактировал раздел вопросов, включив в него использование Promises. Однако я получаю INFO Promise { <pending> } в журналах
@learningMyWayThru Конечно. Я разместил ответ/пример. Надеюсь, это должно заставить его работать.
Измените свой лямбда-код на следующий:
exports.handler = (event, context, callback) => {
// Formulate request
var result = executeRequest(request, function(response) {
console.info("Response Code: ", response.statusCode);
console.info("Response Message: ", response.statusMessage);
// Successfully able to print the response above
callback(null, response);
});
}
Надеюсь, поможет.
Получение ошибки: ReferenceError: обратный вызов не определен
Возможно, вы напечатали это, а не копировали. Вы можете видеть, что это определено с помощью функции стрелки.
@Kanniyan: Вероятно, неправильно истолковал ваш комментарий. :( ... Я отредактировал свой вопрос, включив в него код, основанный на предложенном ответе, а также распечатанный отчет журнала.
console.info("Ответ теста1: ", результат); console.info("Тестовый ответ2: ", обратный вызов); Так как функция не является синхронным вызовом. Вы не можете распечатать переменную вне функции. Вы можете попробовать использовать асинхронность и ждать.
Попробуйте что-нибудь вроде этого.
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.info("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 || '');
});
}
Можете ли вы опубликовать, каков текущий результат, который вы получаете?