Проблема с отправкой почтового запроса от amazon-lambda - PullRequest
0 голосов
/ 05 июля 2019

Я пытаюсь отправить http-запросы в POST из функции amazon-lambda после получения сообщений из очереди amazon (sqs) в мой API. API интегрирует эти сообщения в мою базу данных. для этого я использую Node.js с системой обещаний, но когда я отправляю много сообщений в очереди, запросы не отправляются, и я не понимаю, почему.

Я пробовал несколько способов, в том числе с обещанием, но безуспешно

const http = require('http');

var promises = [];

const options = {
    host: process.env.Host,
    path: process.env.Path,
    port: process.env.Port,
    method: process.env.Method
};

exports.handler = async (event, context) => {
    event.Records.forEach(record => {
        const {
            body
        } = record; // the messages from the bus

        promises.push(PromiseCreator(body));

        Promise.all(promises)
            .then(function(data) {})
            .catch(function(err) {
                return err
            });
    });
};



function PromiseCreator(body) {
    return new Promise((resolve, reject) => {
        const req = http.request(options, (res) => {
            resolve('succès');
        });

        req.on('error', (e) => {
            reject(Error(e));
        });


        // send the request
        req.write(body);
        req.end();

    });
}

Я думаю, что проблема исходит от forEach, но я не знаю, где мне нужно сделать запрос.

Ответы [ 2 ]

1 голос
/ 05 июля 2019

Я думаю, что настоящая проблема в том, что ваша функция запроса немедленно разрешает успех без прослушивания ошибок, что бесполезно. Ваша функция с именем PromiseCreator должна иметь структуру, подобную следующей:

function PromiseCreator(body) {

   return new Promise((resolve, reject) => {

      const req = http.request(options, (res) => {
         if (res.statusCode !== 200) {
            reject("Connection error");
         }

         res.on('error', (error) => {
            reject(error);
         });
      });

      req.on('error', (e) => {
         reject(Error(e));
      });

      req.on("finish", () => {
         resolve("success");
      })

      // send the request
      req.write(body);
      req.end();

   });
}
0 голосов
/ 05 июля 2019

Вы, наверное, правы!

Попробуйте поставить promise.all вне forEach.

И вы можете использовать await вместо .then

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

             event.Records.forEach(record => {

                const { body }  = record; // the messages from the bus
                promises.push(PromiseCreator(body));

             });  

            try {
                 await Promise.all(promises);
            } catch(err) {
                 return err;
            }


    };    
...