Как получить доступ к базе данных из Nestjs Guard - PullRequest
1 голос
/ 04 июля 2019

В настоящее время я пытаюсь выучить nestjs, для этого я следовал официальному (cat-) учебнику по созданию базовой системы аутентификации пользователей.

При доступе к API для изменения имени пользователя или пароля запрос должен проверить, является ли пользователь действительным пользователем (чтение пользователя из базы данных). Для сохранения пользователя у меня уже есть соединение mongodb.

В настоящее время я изо всех сил пытаюсь получить модуль / доступ к базе данных в охране.

Охрана работает, но только возвращает true, я пытался внедрить модуль базы данных, но безуспешно.

@Injectable()
export class AuthGuard implements CanActivate {
  canActivate(
    context: ExecutionContext,
  ): boolean | Promise<boolean> | Observable<boolean> {
    const request = context.switchToHttp().getRequest();
    return this.validateRequest(request);
  }

  validateRequest(execContext: ExecutionContext): boolean | Promise<boolean> | Observable<boolean>{
    const request = execContext.switchToHttp().getRequest();
    const user = request.user;
    return true;
  }
}

Правильный ли подход - расширить класс UserService с помощью метода findOne и внедрить его в службу?

@Injectable()
export class UserService{

    constructor(@Inject('USER_MODEL') private readonly userModel: Model<User>){}

    async create(createUserDto: CreateUserDto): Promise<User>{
        const createdUser = new this.userModel(createUserDto);
        return await createdUser.save();
    }

    async update(updateUserDto: UpdateUserDto): Promise<User>{
        const updateUser = new this.userModel(updateUserDto);
        return await this.userModel.updateOne({loginname: updateUser.loginname}, this.getUpdateQueryFromUserModel(updateUser));
    }

    async delete(deleteUserDto: DeleteUserDto): Promise<User>{
        const deleteUser = new this.userModel(deleteUserDto);
        return await this.userModel.deleteAll({loginname:deleteUser.loginname}).exec();
    }

    async findAll(): Promise<User[]> {
        return await this.userModel.find().exec();
    }

    getUpdateQueryFromUserModel(userModel: Model<User>): Object {
        let query = {};
        if(userModel.dispname !== undefined && userModel.dispname !== null){
            query["dispname"] = userModel.dispname;
        }
        if(userModel.pw !== undefined && userModel.pw !== null){
            query["pw"] = hash.sha256().update(userModel.pw).digest('hex');
        }
        return query;
    }
}

Можете ли вы сказать мне, как выглядит правильный подход? Заранее спасибо!

1 Ответ

0 голосов
/ 04 июля 2019

Я нашел решение для доступа к базе данных, вы можете внедрить его напрямую (пробовал это раньше, но не смог вызвать другую проблему).

@Injectable()
export class AuthGuard implements CanActivate {
    constructor(@Inject('UserService')private readonly userService:UserService){}
  canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {
    const request = context.switchToHttp().getRequest();
    return this.validateRequest(request);
  }

  async validateRequest(execContext: ExecutionContext): Promise<boolean>{
    const request = execContext.switchToHttp().getRequest();
    const user = request.user;
    console.log(await this.userService.findAll());
    return new Promise<boolean>((resolve, reject) => {
        return true;
    });
  }
}

Мой код теперь выглядит так с сервисом, внедренным вконструктор, но он все еще не полностью работает, потому что когда я пытаюсь запустить строку execContext.switchToHttp().getRequest(), я получаю ошибку switchToHttp не является функцией , кто-нибудь может помочь?

Привет Паскаль

...