Как бы я вернул коды статуса и ответы в AWS Lambda? - PullRequest
1 голос
/ 25 сентября 2019

Я пишу лямбда-функцию, которая будет использоваться для отправки тестового сообщения в API.Если возникнут ошибки, мне потребуется, чтобы он запускал определенные функции (например, уведомлял меня с помощью сообщений AWS).Я хотел бы провести простой тест по коду статуса.например, если я получаю 2XX, ничего не делаю, если я получаю 4XX или 5XX, сообщите мне, чтобы я мог исследовать проблемы.В тестовой среде я передаю тело в виде XML-строки в качестве значения в объекте JSON.

пример Лямбда-тестовое событие

{
 "data": "<xml stuff, credentials, etc"
}

вот моя функция

exports.handler = async (event, context) => {

const https = require('https');

const options = {
  hostname: 'https://mythingy.com',
  port: 443,
  path: '/target',
  method: 'POST',
  headers: {'Content-Type': 'application/xml'}
};

const req = https.request(options, res => {
  console.log(`statusCode: ${res.statusCode}`);

  res.on('data', d => {
    process.stdout.write(d);
  });
});

req.on('error', error => {
  console.error(error);
});

req.write(event.data);
req.end();

};

Я использую узел 10.x в Lambda, и я получаю сообщение «Результат успешно» из лямбды, но нет зарегистрированного ответа statusCode.Я сделал это несколькими способами и в прошлом легко извлекал statsCodes из запросов Node fetch, ajax, http.Я знаю, что это, вероятно, как-то связано с завещанием Лямбды и обещанием.Может кто-нибудь помочь мне разобраться, как записать код статистики в Lambda?

1 Ответ

1 голос
/ 25 сентября 2019

Вы не видите его распечатанным, потому что ваша функция async, а https.request использует метод обратного вызова, который будет выполняться асинхронно работниками Node.js.Оказывается, что функция достигнет своего конца, прежде чем она сможет выполнить код внутри обратного вызова.И да, вы правы, это связано с тем, как работают лямбда-функции, потому что они недолговечны (контексты могут быть повторно использованы, но это история для другого вопроса), поэтому процессы завершаются базовыми контейнерами.Это никогда не случалось с вами в традиционных приложениях Node.js, потому что они, как правило, работают за веб-сервером, который отвечает за поддержание процесса в рабочем состоянии, поэтому в конечном итоге выполняются обратные вызовы.

Вам нужно либо обещать https.request, либо использовать библиотеку, которая уже работает с Promises, чтобы вы могли легко await использовать их. Axios и Запрос являются хорошими вариантами.

После того, как вы выбрали свою библиотеку - или пообещали https.request - (я буду использовать axios для моего примера), вы можете просто await на вызов, получить его результаты и делать с ним все, что вы хотите.

const res = await axios.post('https://service-you-want-to-connect-to.com', {})
console.log(JSON.stringify(res)) // here you inspect the res object and decide what do to with the status code.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...