NodeJS Лямбда-функция не проходит циклически по записям - PullRequest
0 голосов
/ 30 июня 2019

Я настраиваю функцию Lambda, которая будет принимать записи из очереди SQS, вызывать API, получать информацию, а затем сохранять эту информацию в RDS.По какой-то причине, когда я перебираю записи и делаю запрос https и mySQL save, эта логика не срабатывает.Я помещаю консольные журналы по всему циклу, и он запускает первый консольный журнал перед запросом https и ничего более.Если я удаляю любое разрешение или возвращаю скрипт, он действительно запускается, перебирая все сообщения, но затем он истекает.

Я пытался использовать обещание.Я попытался сделать функцию асинхронной, но по какой-то причине она просто пропускает конец, и база данных вообще не обновляется.

exports.handler = function(event, context) {

    return new Promise((resolve, reject) => {
        event.Records.forEach(record => {

            const { body } = record
            var receiptHandle = record.receiptHandle;
            var JobNumber = body
            var newJobNumber = JobNumber.replace(/['"]+/g, '');

            console.log(JobNumber);

            var optionsSchedule = {
                host: "api.myteamsoftware.com",
                path: "/WinTeam/Jobs/v2/api/Jobs/" + newJobNumber + "/PersonnelSchedules",
                port: 443,
                method: process.env.requestType,
                headers: {
                    'TenantId': process.env.tenantId,
                    'Ocp-Apim-Subscription-Key': process.env.ocpApimSubscriptionKey,
                    'DateFrom': dateFormat(new Date(), "yyyy-mm-dd"),
                    'DateTo': dateFormat(new Date(), "yyyy-mm-dd")
                }
            };

            console.log('After options set')

            const req = https.request(optionsSchedule, (resSchedule) => {

                if (resSchedule.statusCode < 200 || resSchedule.statusCode >= 300) {
                    return new Error('statusCode=' + resSchedule.statusCode);
                }

                var bodySchedule = [];

                resSchedule.on('data', function(chunk) {
                    bodySchedule.push(chunk);
                });

                resSchedule.on('end', function() {
                    try {

                        //Has to be turned into string in order to PARSE IT
                        bodySchedule = JSON.parse(Buffer.concat(bodySchedule).toString());

                    }
                    catch (e) {
                        return e;
                    }

                    for (var i = 0; i < bodySchedule.length; i++) {

                        values.push([
                            bodySchedule[i].Id,
                            bodySchedule[i].JobNumber,
                            bodySchedule[i].EmployeeNumber,
                            bodySchedule[i].JobPostDetailID,
                            bodySchedule[i].WorkDate,
                            bodySchedule[i].InTime,
                            bodySchedule[i].OutTime,
                            bodySchedule[i].Hours,
                            bodySchedule[i].Lunch,
                            new Date().toISOString()
                        ]);

                    }

                    connection.query(insertQuery + updateQuery, [values], function(err, result) {
                        if (err) throw err;
                        console.log(result);
                    });

                });

            });

            console.log('After request')

            req.on('error', (e) => {
                return e.message;
            })

            req.end();

            var sqs = new AWS.SQS();

            sqs.deleteMessage({
                QueueUrl: ‘xxxxxx’,
                ReceiptHandle: receiptHandle
            });

        });

    }).then(function() {
        console.log('Then')
        connection.query(insertQuery + updateQuery, [values], function(err, result) {
            if (err) throw err;
            console.log(result);
        });
        return 'Then done';
    });

};

Она обрабатывает приведенный выше код, обновляет базу данных, но затем истекает время ожидания.Вот журнал:

START RequestId: 54f63e46-3da8-46b5-b786-a2168b456626 Version: $LATEST
2019-06-30T16:40:06.724Z    54f63e46-3da8-46b5-b786-a2168b456626    100900
2019-06-30T16:40:06.725Z    54f63e46-3da8-46b5-b786-a2168b456626    After options set
2019-06-30T16:40:06.737Z    54f63e46-3da8-46b5-b786-a2168b456626    After request
2019-06-30T16:40:06.743Z    54f63e46-3da8-46b5-b786-a2168b456626    999248
2019-06-30T16:40:06.743Z    54f63e46-3da8-46b5-b786-a2168b456626    After options set
2019-06-30T16:40:06.744Z    54f63e46-3da8-46b5-b786-a2168b456626    After request
2019-06-30T16:40:07.192Z    54f63e46-3da8-46b5-b786-a2168b456626    OkPacket {
  fieldCount: 0,
  affectedRows: 26,
  insertId: 0,
  serverStatus: 2,
  warningCount: 13,
  message: '(Records: 13  Duplicates: 0  Warnings: 13',
  protocol41: true,
  changedRows: 0 }
2019-06-30T16:40:07.203Z    54f63e46-3da8-46b5-b786-a2168b456626    OkPacket {
  fieldCount: 0,
  affectedRows: 25,
  insertId: 0,
  serverStatus: 2,
  warningCount: 19,
  message: ')Records: 19  Duplicates: 13  Warnings: 19',
  protocol41: true,
  changedRows: 13 }
END RequestId: 54f63e46-3da8-46b5-b786-a2168b456626
REPORT RequestId: 54f63e46-3da8-46b5-b786-a2168b456626  Duration: 24024.24 ms   Billed Duration: 24000 ms   Memory Size: 1536 MB    Max Memory Used: 35 MB  
2019-06-30T16:40:30.746Z 54f63e46-3da8-46b5-b786-a2168b456626 Task timed out after 24.02 seconds
...