Javascript 如何解构对象并使用键和值更新MySQL?
我正在将数据从react前端传递到express后端:Javascript 如何解构对象并使用键和值更新MySQL?,javascript,mysql,node.js,express,destructuring,Javascript,Mysql,Node.js,Express,Destructuring,我正在将数据从react前端传递到express后端: axios.post('http://localhost/api', {foo: true, bar: false}); 在后端,我正在更新一个MySQL数据库,如 app.post("/user", (req, res) => { const {foo, bar} = req.body; const sql = `UPDATE users SET foo = ?, bar = ?`; connect
axios.post('http://localhost/api', {foo: true, bar: false});
在后端,我正在更新一个MySQL数据库,如
app.post("/user", (req, res) => {
const {foo, bar} = req.body;
const sql = `UPDATE users SET foo = ?, bar = ?`;
connection.query(sql, [foo, bar], (err) => {
if (err) {
res.send({err: err});
} else {
res.send({updated: true});
}
})
});
如果我不知道我传递的数据的键怎么办?像foo和bar什么都可以
我需要知道当前正在const{foo,bar}=req.body中解构的键。
此外,我需要将它们放在foo=?中更新字符串的列部分?和bar=
我想这样做,以便能够使用相同的函数更新数据库中的不同值。循环键和值,并动态构造SQL
app.post("/user", (req, res) => {
let whitelist = ["foo", "bar"];
let checkWhitelist = Object.keys(req.body).filter((e) => whitelist.includes(e)).length > 0;
if (checkWhitelist) {
let assign = Object.keys(req.body).map(k => `\`${k}\` = ?`).join(', ');
let vals = Object.values(req.body);
const sql = `UPDATE users SET ${assign}`;
connection.query(sql, vals, (err) => {
if (err) {
res.send({err: err});
} else {
res.send({updated: true});
}
})
} else {
res.send({err: "Error"});
}
});
请注意,这是危险的,因为您信任客户端发送有效的列名。在现实生活中,你应该将列名列成白名单。人们也应该在列名周围使用反勾号,即使它们传递了一个允许列表。你的方法是有效的。但我不想有不安全的代码。因此,我是否需要检查键是否是给定数组的一部分@带反勾的BillKarwin您的意思是\`{k}\`=?是的,因为即使您根据我推荐的数组验证列名,如果您有一个合法列与SQL保留关键字冲突,或者包含空格或标点符号,该怎么办?这些是SQL中的合法标识符,但您需要对它们进行分隔。@BillKarwin谢谢,我已经更新了答案。