Бессерверные узлы пропускают https-запрос

Я хочу отправить запрос https и обработать результат с помощью бессерверной среды, но, похоже, это не работает.

Nodejs (бессерверные) пропускают мой запрос и сразу переходят к последнему результату, не дожидаясь ответа https

здесь моя функция:

import { APIGatewayEvent, Callback, Context, Handler } from "aws-lambda";
var AWS = require("aws-sdk");
const querystring = require('querystring');
const https = require('https');

const TOKEN: String = "token";

export const hello: Handler = (
  event: APIGatewayEvent,
  context: Context,
  cb: Callback
) => {
function https_request() {

    var postData = querystring.stringify({
      query: "query"
    });

    var options = {
      hostname: 'example.com',
      port: 443,
      path: '/path',
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        'Authorization': TOKEN
      }
    };


    return new Promise(function(resolve, reject) {
      console.info("before request")
      var req = https.request(options, (res) => {
        console.info('statusCode:', res.statusCode);
        console.info('headers:', res.headers);

        if (res.statusCode !== 200) {

          // REJECT IF THE RESPONSE WASN'T AS EXPECTED
          return reject(new Error('Request failed'));
        }

        res.on('data', (d) => {

          process.stdout.write(d);
          resolve(d); // RESOLVE ON SUCCESS WITH EXPECTED DATA

        });
      });

      req.on('error', (e) => {
        console.error(e);
        reject(e); // REJECT ON REQUEST ERROR
      });

      // req.write(postData);
      req.end();
    }) 

  }
  let x:any;



async function myAsyncF() {
    x= await https_request();
    console.info(x.body)
    return x.body
  }

  myAsyncF()

  const response = {
    statusCode: 200,
    body: JSON.stringify({
      message: x,
      input: event
    })
  };

  cb(null, response);
};

Я использовал асинхронное ожидание, но ничего не возвращается (я должен получить как минимум ошибку, если есть какая-то сетевая ошибка)

вот мой вывод: перед запросом { "Код статуса": 200, "тело": "{\"ввод\":\"\"}" }

чего-то не хватает?

заранее спасибо

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
0
184
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Ни в коем случае вы не разрешаете свой Promise, я понятия не имею, что вы считаете «успешным» запросом, но вот пример, который должен направить вас на правильный путь.

return new Promise(function(resolve, reject) {
  console.info("before request")
  var req = https.request(options, (res) => {
    console.info('statusCode:', res.statusCode);
    console.info('headers:', res.headers);

    if (res.statusCode !== 200) {
      // REJECT IF THE RESPONSE WASN'T AS EXPECTED
      return reject(new Error('Request failed'));
    }

    res.on('data', (d) => {
      process.stdout.write(d);
      resolve(d); // RESOLVE ON SUCCESS WITH EXPECTED DATA
    });
  });

  req.on('error', (e) => {
    console.error(e);
    reject(e); // REJECT ON REQUEST ERROR
  });

  req.write(postData);
  req.end();
})

Спасибо за ваш ответ, но все еще не работает, он пропускает функцию https.request, нет журнала для statusCode или заголовков, я получаю только перед запросом { "statusCode": 200, "body": "{\"message\" :\"\",\"Вход\":\"\"}" }

h.zak 07.06.2019 09:33

@h.zak это потому, что кажется, что вы возвращаете этот объект только в cb , вам нужно получить результат от http_request и добавить его в тело ответа, если это то, что является намерением.

James 07.06.2019 09:58

я добавил в тело, но ничего не изменилось, я обновил код в своем вопросе, потому что я не могу поместить его в комментарий

h.zak 07.06.2019 10:31

Проблема решена с помощью пакета request-promise, я действительно не знаю, что именно я пропустил

h.zak 07.06.2019 10:56

@h.zak в вашем коде было несколько проблем, например. не разрешая обещание (которое касается моего ответа), но тогда вы не распространяли результат из myAsyncF, и, наконец, вы также не ожидаете результата этой функции. Я думаю, что это, вероятно, немного расплывчато, чтобы предположить, что «использование пакета request-promise» решило проблему.

James 07.06.2019 11:17

Удаление process.stdout.write будет не очень хорошей практикой, так как вы запускаете свой код на лямбда, используйте объект контекста или функцию обратного вызова для возврата

process.stdout.write(d) - это операция записи в файл, иногда она также молча терпит неудачу, работая на EC2, ECS ваше решение выглядит жемчужиной. Но на бессерверных серверах всегда лучше избегать функций работы с файлами.

Другие вопросы по теме