AWS Lambda中Sequelize原始查询正常但findAll不触发then回调问题
AWS Lambda中Sequelize的findAll方法无法进入then回调问题
问题现象
在AWS Lambda Node.js运行环境下使用Sequelize操作数据库:
- 调用
sequelize.query执行原始SQL时功能完全正常 - 调用Sequelize模型提供的
findAll方法查询时,代码始终无法进入.then回调分支,无法定位故障原因
异常的findAll实现代码
models.lb2b .findAll({ order: [["id", "DESC"]], attributes: [ "id", "version", ], }) .then((lb2b) => { return { statusCode : 200, body : JSON.stringify( { message : lb2b } ) } }); return response };
正常运行的原始查询实现代码
const lb2b = await sequelize.query("SELECT * FROM lb2b", { type : QueryTypes.SELECT } ); return { statusCode : 200, body : JSON.stringify( { message : lb2b } ) }
故障原因
核心问题是异步逻辑没有被Lambda正确等待:
- 正常运行的原始查询使用了
await关键字,会阻塞等待数据库查询返回结果后,才会执行后续的return逻辑,Lambda能拿到正确的响应内容 - 异常的findAll写法里,只发起了异步查询,没有等待Promise状态变更就直接执行了后续的
return response,Lambda拿到返回值后会立刻冻结当前执行环境,挂起的异步回调根本没有机会执行,自然进不到.then分支。另外代码里.then内部return的响应对象没有被任何变量接收,外部return的response变量在给出的代码片段中甚至没有定义,本身就存在逻辑错误。
修复方案
二选一即可:
- 方案1:和原始查询保持一致,使用
async/await语法等待findAll执行完成后再返回结果
const lb2b = await models.lb2b.findAll({ order: [["id", "DESC"]], attributes: ["id", "version"], }); return { statusCode: 200, body: JSON.stringify({ message: lb2b }) };
- 方案2:直接将整个Promise链式调用返回给Lambda,Lambda会自动等待Promise resolve后取最终结果作为返回值,不要在Promise链外部提前return
return models.lb2b .findAll({ order: [["id", "DESC"]], attributes: ["id", "version"], }) .then((lb2b) => { return { statusCode: 200, body: JSON.stringify({ message: lb2b }) }; });
内容的提问来源于stack exchange,提问作者mooncrunch
相关产品推荐
相关产品推荐

