NodeJS Lambda函数无法正常遍历记录

时间:2019-06-30 16:37:21

标签: node.js amazon-web-services aws-lambda amazon-sqs

我正在设置一个Lambda函数,该函数将从SQS队列中获取记录,调用API,获取信息,然后将该信息保存在RDS中。出于某种原因,当我遍历记录并进行https请求和mySQL保存时,它不会触发该逻辑。我将控制台日志遍历整个循环,并在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

1 个答案:

答案 0 :(得分:0)

您需要在promise块中的某个位置解析或拒绝,以使其移至下一个then()或catch():

return new Promise((resolve, reject) => {
    ... something good happens ...
    return resolve();
    ... something bad happens ...
    return reject();
}).then(function() {
    ... after something good happens ...
}).catch(function() {
    ... after something bad happens ...
});