Доступ к информации аутентифицированного пользователя в области запроса с использованием экспресс - PullRequest
0 голосов
/ 17 мая 2018

Я использую Express с TypeORM, и в настоящее время я застрял в следующей ситуации:

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

С TypeORM это легко сделать с помощью подписчиков:

@EventSubscriber()
export class Subscriber implements EntitySubscriberInterface {
    beforeUpdate(event: UpdateEvent<any>) {
        const entity = event.entity;
        if(entity instanceof Base) {
            entity.lastUpdatedBy = 'username'; // TODO
        }
    }
}

Пользователь известен после успешной аутентификации:

@Put('/entity')
public updateEntity(@CurrentUser({required: true}) user: User, @Body enity: Entity): Promise<Entity> {
    Log.info('User successfully authenticated: ' + user)
    return this.manager.update(entity);
}

У меня такой вопрос: как проще всего хранить и получать доступ к пользовательской информации в области запроса?

Что я узнал до сих пор:

  1. Следующая запись stackoverflow-потока, похоже, связана, но Для меня решение кажется непосильным ( ГЛОБАЛЬНЫЕ данные на HTTP / запрос сеанса? )
  2. Я также могу добавить информацию о пользователе в методе updateEntity, но тогда мне придется явно все время.

Есть ли другой вариант?

Ответы [ 2 ]

0 голосов
/ 15 октября 2018

Вы можете использовать атрибут data типа any из SaveOptions .

@Put('/entity')
public updateEntity(@CurrentUser({required: true}) user: User, @Body enity: Entity): Promise<Entity> {
    Log.info('User successfully authenticated: ' + user)
    return this.manager.update(entity, {data: user});
}

И затем вы можете использоватьданные в подписчике с:

event.queryRunner.data
0 голосов
/ 06 июля 2018

Я использовал следующий пакет npm, чтобы сохранить пользователя в моей области запроса: https://www.npmjs.com/package/cls-hooked.

Этот пакет не работал для меня, так как async / await, похоже, не поддерживается: continue-local-storage.

...