Node.js中URL传整数参数时Restful API无响应故障如何解决
问题定位&修复方案
第一步:修正访问路径
你当前的请求地址格式错误,GET请求的第一个查询参数需要用?开头,而非&,你使用的localhost:3000/&id=13不符合传参规范,正确访问地址应为:localhost:3000/?id=13
&仅用于多个查询参数之间的分隔,例如需要传两个参数时写法为localhost:3000/?id=13&date=20240101。
第二步:修复代码显性问题
原代码存在多处逻辑错误,是导致请求异常的核心原因:
- 重复引入
express模块,冗余代码可能引发未知问题 - 数据库查询成功后将结果赋值给
aladinModel变量,但实际返回给前端的是空字符串ardaforecast,就算查询成功也拿不到有效数据 - 没有对传入的
id做非空校验,id为空时调用存储过程必然报错 - 出错时没有打印实际数据库错误信息,无法定位数据库层面的根因
- 存储过程调用直接拼接参数,存在SQL注入风险,同时容易引发语法错误
修复后的完整代码
// Create express app var express = require("express") var app = express() var mysql = require('mysql') var cors = require('cors') app.use(cors()) // Server port var HTTP_PORT = 3000 var pool = mysql.createPool({ connectionLimit: 10, host: '192.168.0.1', user: 'user', port: '3388', password: 'password', database: 'databasename' }); app.route('/') .get(function (req, res) { res.setHeader('Access-Control-Allow-Origin', '*'); res.setHeader('Cache-Control', 'private, no-cache, no-store, must-revalidate'); const id = req.query.id; // 校验必填参数 if (!id) { return res.status(400).json({ error: "缺少必填参数id" }) } // 使用参数化查询避免注入和语法错误 pool.query(`CALL Get_Alert_levels_Station(?)`, [id], function (error, result) { if (error) { // 控制台打印真实错误信息,方便排查 console.error('数据库查询错误:', error) return res.status(500).json({ error: "Грешна заявка. Опитай отново !"}) } // 返回实际查询结果 res.json({ ardaforecast: result }) }); }); // Start server app.listen(HTTP_PORT, () => { console.log("Server running on port %PORT%".replace("%PORT%", HTTP_PORT)) }); pool.on('error', function (err) { console.log('数据库连接池错误:', err.code); }); app.use(function (req, res) { res.status(404).json({error: '接口不存在'}) })
仍报错的后续排查方向
- 查看服务端控制台打印的数据库错误信息,如果提示存储过程不存在,说明你新对接的数据库中没有创建
Get_Alert_levels_Station这个存储过程,需要确认创建 - 确认192.168.0.1的3388端口是否对服务端部署的机器开放,有没有防火墙拦截
- 确认你使用的数据库账号是否有执行
Get_Alert_levels_Station存储过程的权限
内容的提问来源于stack exchange,提问作者Pizhev Racing
相关产品推荐
相关产品推荐

