更新不同属性的最佳方法是什么?
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。为此
- 深度克隆该对象,因此将有另一个具有新引用的用户对象
- 从深度克隆对象中删除
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 传递给 userService
的 update
方法。
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);
}
我正在用 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。为此
- 深度克隆该对象,因此将有另一个具有新引用的用户对象
- 从深度克隆对象中删除
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 传递给 userService
的 update
方法。
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);
}