javascript - 节点 js Lamba 不等待 db 事件完成
问题描述
我有一个 lambda 函数,它连接到 MySQL 并将数据流式传输到 aws sqs,此代码在本地运行良好,但是当在 lambda 中运行时,函数在将事件发布到 sqs 之前终止,lambda 不等待事件循环完成。
以下是代码。
exports.handler = async (event,context) => {
return new Promise((resolve,reject)=>{
context.callbackWaitsForEmptyEventLoop = true;
console.log("running handler");
query().then((message)=>{
console.log("sucess++++ " + message);
resolve(message);
},(error)=>{
console.log("Error++ " + error);
reject(error);
});
})
};
function query() {
logger.info("inside query()");
return new Promise((resolve,reject)=>{
try {
connection = mysql.createConnection({
host: HOST,
user: USER,
password: PASSWORD,
port: PORT
});
const dateObject = getDateObject();
console.log('dateobject ' + dateObject);
let sql = fs.readFileSync('./sql/test.sql').toString();
const finalSql = sql.replace(/{dateString}/g, dateObject);
// logger.info("running query " + finalSql);
console.log(finalSql);
var query = connection.query(finalSql);
query
.on('error', async function (err) {
logger.error("error while running query " + err);
reject(err);
})
.on('fields', function (fields) {
})
.on('result', async function (row) {
// connection.pause();
await processRow(row);
})
.on('end', async function () {
logger.info("all rows have been received");
//logger.info("closing connections");
resolve("sucesss");
connection.end();
});
}
catch (error) {
console.log(error);
logger.error(error);
}
})
}
// };
async function processRow(row) {
await sendMessage(row);
}
function getDateObject() {
//return dateObj;
}
async sendMessage(message) {
let messageBody = {};
messageBody['Subject']="xyz";
messageBody['Message']= JSON.stringify(message);
var params = {
DelaySeconds: 0,
QueueUrl: SQS_URL,
MessageBody: JSON.stringify(messageBody)
}
this.sqs.sendMessage(params, function (err, data) {
if (err) {
logger.error("Error" + err);
} else {
logger.info("Success" + data.MessageId);
}
});
}
早些时候我尝试使用异步等待而不是承诺,但仍然无法按预期工作
我得到的结果是
sucess++++ sucesss
并在此之后终止而不发布消息。如果我在处理程序中使用 timeout() 并让函数等待,那么它工作正常。
它不起作用的任何原因。
解决方案
推荐阅读
- android - 清除活动 Android
- javascript - 如何将唯一的可访问/可传递值烘焙到多个显示按钮中?
- r - 无法使用 R 的 tm 中的 DataframeSource 从数据帧中获取元数据
- html - 单击带有一些动画效果的li元素如何从底部缓慢移动到顶部位置
- python - 如何保存来自 python 循环的不同名称的多个绘图?
- maven - 删除万能插件
- docker - 如何使用 docker 配置 Corda 网络(使用 YAML 文件)
- c# - C# - Asp.net Web API 测试项目 - 如何模拟用户并在特定用户下运行测试用例
- c# - log4net.Appender 中缺少 AdoNetAppender 类
- spring-boot - 使用 H2 和 JPA 的 Spring Boot 集成测试失败