调用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
相关产品推荐
相关产品推荐

