Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何解构对象并使用键和值更新MySQL?_Javascript_Mysql_Node.js_Express_Destructuring - Fatal编程技术网

Javascript 如何解构对象并使用键和值更新MySQL?

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

我正在将数据从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 = ?`;
  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谢谢,我已经更新了答案。