Node.js+mssql插入语句报错:无法绑定多部分标识符req.body.CSubCategory
解决SQL插入时"无法绑定多部分标识符req.body.CSubCategory"的错误
我一眼就看出问题出在哪了——你写的INSERT语句直接把JavaScript变量req.body.CName和req.body.CSubCategory硬塞进了SQL字符串里!SQL服务器根本不认识这些是前端传过来的参数,它会把req.body.CSubCategory当成数据库里的某个字段名来解析,自然就报"无法绑定多部分标识符"的错误了。
下面给你两种解决方案,推荐用第二种,安全又规范:
方案1:用模板字符串拼接(仅适合测试环境)
这种方法能快速解决问题,但有严重的SQL注入风险,生产环境绝对不能用:
app.post("/api/Category", function(req , res){ // 用ES6模板字符串把变量嵌入SQL语句,注意给字符串值加单引号 var query = `INSERT INTO [Category] (CName,CSubCategory) VALUES ('${req.body.CName}', '${req.body.CSubCategory}')`; executeQuery (res, query); });
提醒:如果用户输入的内容包含单引号(比如
O'Neil),这条语句会直接报错,还可能被恶意攻击者利用注入恶意SQL。
方案2:参数化查询(推荐,安全高效)
这是数据库操作的最佳实践,mssql库本身就支持参数化查询,能彻底避免SQL注入,还能处理各种特殊字符:
第一步:修改executeQuery函数,让它支持接收参数
var executeQuery = function(res, query, params){ sql.connect(dbconfig,function(err){ if(err){ console.log("there is a database connection error -> "+err); res.send(err); } else{ var request = new sql.Request(); // 把参数添加到请求对象中 if(params){ Object.keys(params).forEach(key => { request.input(key, params[key]); }); } request.query(query,function(err,result){ if(err){ console.log("error while querying database -> "+err); res.send(err); } else{ res.send(result); sql.close(); } }); } }); }
第二步:修改POST接口,使用参数化的SQL语句
app.post("/api/Category", function(req , res){ // 用@前缀定义SQL参数 var query = "INSERT INTO [Category] (CName,CSubCategory) VALUES (@CName, @CSubCategory)"; // 准备参数对象,键名要和SQL里的@参数名对应 var params = { CName: req.body.CName, CSubCategory: req.body.CSubCategory }; executeQuery (res, query, params); });
另外还有个小细节要修正:你代码里的bodyPasrser是拼写错误,应该是bodyParser,虽然可能不影响运行,但最好改过来避免潜在问题:
var bodyParser = require('body-parser'); app.use(bodyParser.json());
内容的提问来源于stack exchange,提问作者Mohammed Ehab
相关产品推荐
相关产品推荐

