我在node.js服务器上有一条发布路由,我想在正文请求中发送一个json对象,以将其插入到sql数据库中。
如果我使用"INSERT INTO users(UserInfo, BitMask) Values ("value1", 1)"
它可以工作,但是如果我尝试像下面的示例中那样对对象进行转场,则不会。
我也尝试过"INSERT INTO users(UserInfo, BitMask) Values ?", [client],
但这不起作用。
router.post("/add/client", (request, res) => {
let client = {}
client.UserInfo = request.body.name;
client.BitMask = request.body.bitmask;
pool.request().query("INSERT INTO users(UserInfo, BitMask) Values ?" + mysql.escape(client),
(err, result)=>{
if(!err){
return res.json({ success: true, data: result, records_added: result.affected_rows });
}
return res.json({ success: false, data: err });
})
});
此代码返回以下对象:
{
"success": false,
"data": {
"code": "EREQUEST",
"number": 0,
"originalError": {
"sqlstate": "07002",
"code": 0
},
"name": "RequestError"
}
}
有人知道我在这里想念什么吗? 我在Google上找到的答案之一是,问题出在查询中多次使用占位符,但事实并非如此。
感谢您的帮助。
答案 0 :(得分:1)
使用参数化查询,我还会选择async
/ await
语法以提高可读性
router.post("/add/client", async (request, res) => {
try {
const result = await pool.request()
.input('userInfo', request.body.name)
.input('bitmask', request.body.bitmask)
.query("INSERT INTO users(UserInfo, BitMask) Values (@userInfo, @bitmask)");
return res.json({
success: true,
data: result, // I would avoid this, potential to leak DB info to the client
records_added: result.affected_rows
});
} catch (e) {
// consider returning next(e) here and handling errors somewhere common
return res.json({
success: false,
data: err // don't do this, again potential to leak DB info to the client
});
}
});