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

How to destructure an object and update MySQL with keys and values?

我正在将数据从 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"});
  }
});

请注意,这很危险,因为您信任客户端会发送有效的列名。在现实生活中,您应该将列名列入白名单。