node-postgres 动态查询

node-postgres dynamic query

我正在构建一个 REACT 笔记应用程序。 我只跟踪用户对笔记所做的更改,而不是笔记的当前状态。 如果特定 属性 没有变化,属性 将作为空字符串发送。 我正在使用以下函数在 NODE (node-postgres) 中处理此问题:

const updateNote = async (req, res) => {
  const { category, title, body, nid } = req.body;
  let noteStatement = "";
  let valueStatement = "";
  for (const key in req.body)
  {
    if (req.body[key] !== "" && key !== "nid") {
      noteStatement = noteStatement + key + ", ";
      valueStatement = valueStatement + `'${req.body[key]}', `;
    }
  }
  try {
    const result = await pool.query(
      `UPDATE notes SET (${noteStatement}last_updated) 
      = (${valueStatement}(to_timestamp(${Date.now()} / 1000.0))) 
      WHERE nid = ${nid} RETURNING *`
    );
    const note = result.rows;
    return res.status(200).send({ note });
  } catch (err) {
    return res.send({error: err});
  }
};

我可能想多了,但目标是尽可能将最小的数据发送到数据库。 我在这上面花了相当多的时间,这是我想出的最实用的方法。 编写这种类型的查询是不好的做法吗? 发送所有注释数据(包括尚未从 React 更新的属性)并使用固定查询更新所有属性是否更有意义?

编辑:更新查询

const updateNote = async (req, res) => {
    const { category, title, body, nid } = req.body;
    const text = `UPDATE notes SET (category, title, body, last_updated) 
            = (, , , (to_timestamp(${Date.now()} / 1000.0))) 
            WHERE nid =  RETURNING *`;
    const values = [category, title, body, nid];
    try {
        const result = await pool.query(text, values);
        const note = result.rows;
        return res.status(200).send({ note });
    } catch (err) {
        return res.send({ error: err });
    }
};

我想发表评论,但很快意识到我已接近字符数限制,所以我只能将其作为回复。

首先,我想确保我了解您要完成的任务。我假设您只想使用客户端提供的字段更新您的数据库。考虑到这一点,我只想强调一个事实,即大多数人都试图将不应该做的事情复杂化。软件中的一切都是一种权衡,在您的情况下,您的数据并不大,不必担心只更新某些字段。它可以完成,但不是你现在做的方式,你可以有一个效用函数,它会根据不是 empty/null 的值构建一个 parameterized query,具体取决于你将如何发送数据客户端没有改变

这让我想到了第二件事,你永远不应该像你那样写一个 SQL 查询,通过连接一个字符串,让你容易受到 SQL 注入。相反,您 必须 始终使用 parameterized query 除非您使用某种抽象编写查询 (ORM) 的库。

As a sidenote, never trust data that comes from the client, so always, always validate the data on the server before you make any changes to the DB, even if you already did validation on the client. You can do it using a middleware like celebrate or other validation libraries. Never trust anything that comes from the client.