Sequelize与Node.js中Promise resolve失效,调用MSSQL存储过程求助
解决Sequelize结合Promise调用MSSQL存储过程失败的问题
我来帮你排查这个问题!你遇到的核心问题是手动封装Promise的方式错误,而且其实完全没必要这么做——Sequelize的connection.query本身就已经返回Promise了,不需要额外手动包裹。
问题根源分析
你在getData函数里手动创建了一个Promise,但误用了Sequelize query回调的参数:
- Sequelize的
query方法如果传入回调,参数格式是(error, results),而不是你写的(error, meta, body),所以你拿body根本获取不到正确的查询结果,这直接导致后续的resolve(body.toString())无法得到有效数据。 - 更关键的是,
connection.query本身就会返回一个Promise,完全不需要你手动new Promise来封装,画蛇添足反而引入了错误。
修正后的代码
简化getData函数
直接返回connection.query的Promise即可,不用手动封装:
function getData(numTravessia) { return connection.query( 'EXEC [dbo].[SP_RECUPERAINFOTRAVESSIA] @ID=:param1', { replacements: { param1: numTravessia }, type: QueryTypes.SELECT } ); }
优化getInfoTravessia函数
因为getData已经返回Promise,await之后直接处理结果即可,和你之前的非Promise版本逻辑保持一致:
async function getInfoTravessia(numTravessia) { try { const result = await getData(numTravessia); // 和你非Promise版本一样,取结果数组的第一个元素 const obj = result[0]; // 这里不需要toString再JSON.parse,因为Sequelize已经返回了对象 return obj; } catch (error) { console.error('获取数据出错:', error); // 抛出错误让调用方的catch捕获 throw error; } }
调用部分保持不变
app.listen(8000, () => { console.log("aplicativo em execução"); getInfoTravessia(1955) .then((result) => { console.log(result); }) .catch((e) => { console.log(e); }); });
补充说明
你之前的非Promise版本能正常运行,就是因为直接用了connection.query返回的Promise进行链式调用,而手动封装Promise时搞错了回调参数,才导致失败。以后遇到Sequelize的方法,先确认是否本身就支持Promise,避免重复封装引入错误。
内容的提问来源于stack exchange,提问作者Ediberto
相关产品推荐
相关产品推荐

