更新不同属性的最佳方法是什么?

What is the best way to update different properties?

我正在用 Restify 构建一个 API,它基于 Express。我正在使用 Typeorm,我想知道更新来自用户输入的不同属性的最佳方法是什么。

基本上我有这样一条路线:

server.put('/users/:id', errorHandler(update));

触发此方法的方法:

const update = async (req: Request, res: Response) => {
    const user = { ...req.body, id: req.params.id } as User;
    res.send(await userService.update(user));
}

如您所见,我使用展开运算符创建了一个 User 实体。然后,在 userService.update 里面我有以下内容:

export const update = async (user: User): Promise<User> => {
    const repository = getRepository(User);
    const entity = await repository.findOne({ id: user.id });
    if (!entity) throw new errors.ResourceNotFoundError(`There is no user with id of ${user.id}`);

    Object.assign(entity, user, { id: entity.id, chat_id: entity.chat_id, project_id: entity.project_id, deleted: false });
    return await repository.save(entity);
}

如您所见,我想防止API消费者提供的数据替换一些重要的属性,如:id, chat_id, project_id, deleted,所以我使用方法Object.assign来实现这个。

这样好吗?您有什么改进建议?

您可以像这样使用 typeorm 的 update 方法,它会部分更新您作为第二个参数提供的值。

// this will find a user with id ${user.id} and will only 
// change the fields that is specified in the user object
await repository.update(user.id, user);

// check if updated for debugging 
const updatedUser = await repository.findOne(user.id);
console.log(updatedUser, null, 2) 

如果你想在数据库中创建一个现有用户的新记录,那么你只需要改变它的id。为此

  1. 深度克隆该对象,因此将有另一个具有新引用的用户对象
  2. 从深度克隆对象中删除 id 字段,然后使用 insert
// Deep clone user object
const clonedUser = JSON.parse(JSON.stringify(user))
// Delete id field from the deep clone 
delete clonedUser.id;
// create a new user with different id
await repository.insert(clonedUser);

您可以过滤您的重要属性。

并将用户 ID 传递给 userServiceupdate 方法。

const { id, chat_id, project_id, deleted, ...user } = req.body;
const { id } = req.params;

res.send(await userService.update(id, user));

这将确保 user 对象没有属性(这很重要)。

您可以像下面这样更改 update 方法:

export const update = (userId: string, user: User): Promise<User> => {
    return getRepository(User).update(userId, user);
}