实现 PATCH API 端点的优雅方式?

Elegant way of implementing a PATCH API endpoint?

我想部分更新我的用户对象,因为用户可以在创建用户后更新他们选择的任何属性。

例如,他们可以决定提供布尔主机值、dob、and/or 电话号码,但这些属性是可选的。

检查 PATCH 请求中提供了哪些字段并仅更新那些属性的最佳方法是什么?

用户架构:

CREATE TABLE users (
  id uuid PRIMARY KEY DEFAULT
  uuid_generate_v4(),
  first_name VARCHAR(255) NOT NULL,
  middle_name VARCHAR(255),
  last_name VARCHAR(255) NOT NULL,
  email VARCHAR(255) NOT NULL,
  password VARCHAR(255) NOT NULL,
  created_on TIMESTAMPZ NOT NULL,
  host BOOLEAN NOT NULL DEFAULT FALSE, 
  updated_on TIMESTAMPZ,
  email_verified BOOLEAN NOT NULL DEFAULT FALSE,
  last_login TIMESTAMPZ,
  telephone VARCHAR(15),
  dob DATE,
);

用户更新控制器

const update = async (req, res, next) => {    
  try {
    //1. Destructure the req.body 
    const {host, telephone, dob} = req.body;

    //2. Enter the updated user attributes inside of database
    const updatedUser = await pool.query(
      "UPDATE users SET host = , updated_on = NOW() WHERE id =  RETURNING *", [
        req.user, host
      ]
    );

    res.status(200).json({message: 'Your profile has been successfully updated'});
  } 
  catch (err) {
    console.error(err.message);
    res.status(500).send("Server Error");  
  }
};
     

我建议使用 COALESCE。您可以像这样使用它:

UPDATE users SET host = COALESCE(, host), updated_on = NOW() WHERE...

这将覆盖数据库中 host 的值(如果提供)。如果不是,它会保留当前分配的值。

来源:https://www.postgresqltutorial.com/postgresql-coalesce/