You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 19:18:00