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

调用SQL Server存储过程时出现TypeError: connection.on is not a function错误求助

问题排查:调用存储过程触发TypeError: connection.on is not a function

核心原因分析

从错误栈路径能看出,mssql库内部错误地在msnodesqlv8驱动的连接对象上调用了on方法——但msnodesqlv8的连接模型和tedious驱动不同,本身不提供这个事件绑定方法,导致触发类型错误。而常规SQL查询正常,说明基础连接逻辑没问题,问题出在存储过程调用的适配逻辑上。

排查&修复步骤

1. 修正存储过程的调用写法

避免混用tedious驱动的事件API,改用msnodesqlv8支持的调用方式:

  • 错误示例(触发问题):
const request = new sql.Request(connection);
request.on('row', (row) => { /* 处理行数据 */ }); // msnodesqlv8的request不支持该事件
request.execute('YourStoredProc');
  • 正确写法:
// 方式1:用模板字符串直接调用
const result = await sql.query`EXEC YourStoredProc @param1 = ${value1}`;

// 方式2:用request的query方法
const request = pool.request();
const result = await request.query('EXEC YourStoredProc @param1 = @val', { val: value1 });

2. 验证依赖版本兼容性

mssql与msnodesqlv8版本不匹配会导致驱动适配逻辑混乱:

  • 查看package.json中的版本号,确保mssql@9.x+搭配msnodesqlv8@2.x+,或根据官方文档确认对应版本组合。
  • 重新安装匹配版本:
npm uninstall mssql msnodesqlv8
npm install mssql@latest msnodesqlv8@latest

3. 规范连接对象的获取方式

必须通过mssql的连接池获取连接,禁止直接实例化底层驱动的连接对象:

// 正确的连接池初始化
const pool = new sql.ConnectionPool({
  driver: 'msnodesqlv8',
  server: '你的数据库地址',
  database: '目标数据库',
  options: {
    trustedConnection: true // 或配置user/password
  }
});
await pool.connect();

// 通过连接池执行存储过程
const result = await pool.request().query('EXEC YourStoredProc');

手动创建底层驱动连接会导致mssql无法正确封装对象,后续调用时找不到预期方法。

4. 检查存储过程参数传递

如果存储过程包含输出参数,需用msnodesqlv8支持的方式定义:

const request = pool.request();
request.input('InputParam', sql.VarChar, '输入值');
request.output('OutputParam', sql.Int);
const result = await request.execute('YourStoredProc');
console.log(result.output.OutputParam);

错误的参数定义可能触发库内部错误的驱动分支逻辑。

额外验证

若以上步骤无效,编写最小化测试脚本:仅保留数据库连接和存储过程调用逻辑,排除业务代码干扰,确认问题是否复现,以此缩小排查范围。

内容的提问来源于stack exchange,提问作者santosh nandan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 11:40:57