node.js - NodeJS Lambda函数不会正常循环记录
问题描述
我正在设置一个 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
解决方案
你需要在 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 ...
});
推荐阅读
- iis - 将 .NET Core APP V2.2 托管到 IIS 错误 500
- microsoft-teams - 关于 MS Teams 申请流程的说明
- javascript - 无法在反应传单 next.js 中加载标记
- c# - Process.Start() 找不到文件?
- visual-studio-code - 使用“任何”字符进行 Visual Studio 代码搜索
- pandas - 在 Python 中对 DataFrame 循环逻辑回归
- javascript - XPath:查找
- 两个之间的兄弟元素
- 同为兄弟的元素
- azure - SignInSignup 登录后 Azure B2C 路由重置密码流只有几个用户
- arrays - 基于map的key过滤JSON数据
- node.js - 检索 Mongoose 查询队列时间指标