如何使用 express 和 typeorm 正确更新实体
How to correctly update an entity with express and typeorm
我正在寻找使用 typeorm 和 express 更新 User
实体的最佳方法。
我有这样的东西(我减少了,但还有很多其他属性):
class User {
id: string;
lastname: string;
firstname: string;
email: string;
password: string;
isAdmin: boolean;
}
我有一条更新用户属性的路径,例如:
app.patch("/users/me", ensureAuthenticated, UserController.update);
现在(这是我的问题),如何正确更新用户?我不希望用户能够将自己添加为管理员。
所以我有:
export const update = async (req: Request, res: Response) => {
const { sub } = res.locals.token;
const { lastname, firstname, phone, email } = req.body;
const userRepository = getRepository(User);
const currentUser = await userRepository.findOne({ id: sub });
const newUserData: User = {
...currentUser,
lastname: lastname || currentUser.lastname,
firstname: firstname || currentUser.firstname,
phone: phone || currentUser.phone,
email: email || currentUser.email
};
await userRepository
.update({ id: sub }, newUserData)
.then(r => {
return res.status(204).send();
})
.catch(err => {
logger.error(err);
return res.status(500).json({ error: "Error." });
});
};
有了这个,我肯定会更新正确的属性,而用户无法更新管理员。
但是我发现创建一个新对象并填写信息非常冗长。
你有更好的方法吗?
谢谢
您可以关注DTO pattern。
例如:
class UserDto {
// define properties
constructor(data: any) {
// validate data
...
}
}
const userDto = new UserDto(req.body);
await userRepository
.update({ id: sub }, userDto)
.then(r => {
...
})
.catch(err => {
...
});
nestjs 框架有一个 good example of how you can set up a DTO pattern generically. But it's easy enough to roll your own using class-validator and class-transformer 这将使验证更具声明性。
我正在寻找使用 typeorm 和 express 更新 User
实体的最佳方法。
我有这样的东西(我减少了,但还有很多其他属性):
class User {
id: string;
lastname: string;
firstname: string;
email: string;
password: string;
isAdmin: boolean;
}
我有一条更新用户属性的路径,例如:
app.patch("/users/me", ensureAuthenticated, UserController.update);
现在(这是我的问题),如何正确更新用户?我不希望用户能够将自己添加为管理员。
所以我有:
export const update = async (req: Request, res: Response) => {
const { sub } = res.locals.token;
const { lastname, firstname, phone, email } = req.body;
const userRepository = getRepository(User);
const currentUser = await userRepository.findOne({ id: sub });
const newUserData: User = {
...currentUser,
lastname: lastname || currentUser.lastname,
firstname: firstname || currentUser.firstname,
phone: phone || currentUser.phone,
email: email || currentUser.email
};
await userRepository
.update({ id: sub }, newUserData)
.then(r => {
return res.status(204).send();
})
.catch(err => {
logger.error(err);
return res.status(500).json({ error: "Error." });
});
};
有了这个,我肯定会更新正确的属性,而用户无法更新管理员。 但是我发现创建一个新对象并填写信息非常冗长。
你有更好的方法吗? 谢谢
您可以关注DTO pattern。
例如:
class UserDto {
// define properties
constructor(data: any) {
// validate data
...
}
}
const userDto = new UserDto(req.body);
await userRepository
.update({ id: sub }, userDto)
.then(r => {
...
})
.catch(err => {
...
});
nestjs 框架有一个 good example of how you can set up a DTO pattern generically. But it's easy enough to roll your own using class-validator and class-transformer 这将使验证更具声明性。