调用MSSQL存储过程报错:APN参数验证失败(无效数字)
解决MSSQL存储过程调用中APN参数的"Invalid number"错误
问题核心原因
- 请求参数获取错误:你的Express控制器函数参数定义不符合框架规范——Express请求处理函数默认参数为
(req, res, next),你直接将APN等业务参数放在函数参数位置,导致这些参数实际是undefined或非预期值,无法转换为有效的Float类型。 - 参数名拼写错误:代码中输入参数
MONTH_YEAER拼写错误,与存储过程的参数名MONTH_YEAR不匹配。 - 连接池管理不当:直接调用
sql.close()会关闭整个数据库连接池,导致后续请求无法正常连接数据库。
修正后的完整代码
exports.ExportPropertyReport = catchAsyncErrors(async(req, res) => { // 从请求体获取参数(GET请求改用req.query) const { APN, TimeTrend, MONTH_YEAR, lowrange, highrange } = req.body; // 前置验证APN有效性 if (!APN || isNaN(parseFloat(APN))) { return res.status(400).json({ error: true, message: "APN必须是有效的数字" }); } let pool; try { pool = await sql.connect(config, { requestTimeout: 30000 }); const result = await pool.request() .input('APN', sql.Float, parseFloat(APN)) // 强制转换为有效Float类型 .input('TimeTrend', sql.NVarChar, TimeTrend) .input('MONTH_YEAR', sql.NVarChar, MONTH_YEAR) // 修正拼写错误 .input('LOWRANGE', sql.VarChar, lowrange) .input('HighRange', sql.VarChar, highrange) .execute('dbo.Usp_ExportPropertyReport'); console.log(result.recordset); res.status(200).json({ success: true, message: `ExportPropertyReport called successfully`, data: result.recordset // 返回具体记录集更符合接口规范 }); } catch (err) { console.error(err); res.status(500).json({ error: true, message: "执行查询失败", detail: err.message // 返回具体错误信息便于调试 }); } finally { // 释放当前连接池实例 if (pool) { await pool.close(); } } });
额外注意事项
- 匹配存储过程参数类型:确认
Usp_ExportPropertyReport中APN参数的实际类型,若为INT或DECIMAL,需将代码中的sql.Float替换为对应类型(如sql.Int、sql.Decimal)。 - 参数来源一致性:根据请求方式调整参数获取位置——POST请求用
req.body,GET请求用req.query,确保前端传递的参数名与后端一致。 - 全局输入验证:对所有业务参数添加有效性校验,避免无效值传入数据库触发错误。
内容的提问来源于stack exchange,提问作者Rajesh Alda
相关产品推荐
相关产品推荐

