Как лучше всего обновлять различные свойства? - PullRequest
0 голосов
/ 06 августа 2020

Я создаю API с Restify, который основан на 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, чтобы добиться этого.

Это хороший способ? Что вы предлагаете для улучшения?

Ответы [ 2 ]

1 голос
/ 06 августа 2020

Вы можете отфильтровать важные свойства.

И передать идентификатор пользователя методу update вашего userService.

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);
}
1 голос
/ 06 августа 2020

Вы можете использовать такой метод update typeorm, он будет частично обновлять значения, которые вы даете в качестве второго аргумента.

// 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) 

Если вы хотите создать новую запись существующего пользователя в db, вам нужно только изменить его идентификатор. Для этого

  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);

...