Как правильно обновить сущность с помощью express и typeorm - PullRequest
2 голосов
/ 11 апреля 2019

Я ищу лучший способ обновить сущность User с помощью typeorm и express.

У меня есть что-то вроде этого (я уменьшил, но есть много других атрибутов):

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." });
    });
};

При этом я обязательно обновлю нужные атрибуты, а пользователь не сможет обновить admin. Но я считаю очень многословным создание нового объекта и заполнение информации.

У вас есть лучший способ сделать это? Спасибо.

1 Ответ

0 голосов
/ 11 апреля 2019

Вы можете следовать шаблону DTO .

Например:

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 есть хороший пример того, как вы можете настроить шаблон DTO в общем. Но достаточно просто свернуть свои собственные, используя class-validator и class-transformer , что сделает проверку намного более декларативной.

...