当前位置: 首页 > 知识库问答 >
问题:

如何从nestjs guard访问数据库

谷善
2023-03-14

目前,我尝试学习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;
  }
}

使用findOne方法扩展UserService类并将其注入到服务中是正确的方法吗?

@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个答案

袁泰
2023-03-14

我找到了一个数据库访问的解决方案,您可以直接注入它(以前尝试过,但由于另一个问题而失败)。

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

我的代码现在看起来像这样,在构造函数中注入了服务,但它仍然不能完全工作,因为当我试图运行ontext.switchToHttp(). getRequest()行时,我得到一个错误开关ToHttp不是一个函数,有人能帮忙吗?

帕斯卡你好

 类似资料:
  • 问题内容: 我有一个Iron-router路由,我想通过它通过HTTP POST请求接收经纬度数据。 这是我的尝试: 但是查询服务器: 返回。 也许不包含发布数据?我试图检查对象和请求,但找不到。 问题答案: Iron- router中的连接框架使用bodyParser中间件来解析主体中发送的数据。bodyParser使该数据在对象中可用。 以下对我有用: 这给了我: 另请参见此处:http :

  • 问题内容: 我有一个要求,即只能从本地主机访问mysql数据库。我必须实现一个可以访问数据库的servlet,以允许该系统中的其他服务器访问数据(servlet可以充当代理)。但是,此系统由一个远程服务器组成,该服务器下载执行以下语句的大部分数据: 有人可以建议我如何编写一个以有效方式流式传输此类数据的servlet吗(我是数据库新手)? 问题答案: 首先,我不建议为此使用servlet。有关正确

  • 在Spring Boot项目中,我试图从我的IDE中查看内存中的表。 如何从Intellij IDEA访问内存中的h2数据库。 这是我的应用程序的一个片段。yml:

  • 我有一个docker compose文件,看起来像: 运行之后,我看到所有的服务都启动了,并且看起来工作良好。我的服务使用以下sqlalchemy连接字符串连接到postgres: 编辑:这是在接受的解决方案中的一个评论中回答的,但我认为值得在这里指出:我已经在本地运行postgres,这引起了各种混乱。 删除我的本地postgres实例并更新我的hosts文件,就像接受的答案中提到的那样,一切都

  • 我正在构建一个android应用程序,使用谷歌app engine后端。 我在谷歌云存储的一个桶里有一些音频文件(手动上传),我想从后端访问它们(我想获得它们的URL并将它们发送到我的应用程序,这样它就可以播放音频文件)。 谢谢:)

  • 我正在向用户发送动态通知。因此,我正在处理Firebase云函数。这里是我的问题:我如何访问云功能端的数据库? 这是我的代码: 正如你们所看到的,首先,我想从nofications集合中获取电子邮件,然后使用该电子邮件,我想搜索正在使用该电子邮件的用户,然后,我想获取用户deviceToken。 我尝试了很多关于语法的东西,但没有得到任何结果:/ 同样,我也犯了一些错误: 在这里您可以看到错误: