2

我正在尝试使用 JwtAuthGuard 来区分经过身份验证的请求和未经身份验证的请求。

我确实遵循了有关 authentification 的 Nestjs 官方文档,但是,由于出现打字稿错误,我无法使其工作:TS2339: Property 'user' does not exist on type 'Request'.

bookmarks.controller.ts

import { Controller, Get, Req, UseGuards } from '@nestjs/common'
import { BookmarksService } from './bookmarks.service'
import { StandardSuccessResponse } from '../utils/standard-response.type'
import { ResponseMessage } from '../utils/response-messages.enum'
import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard'

@Controller('v1/bookmarks')
export class BookmarksController {
  constructor(private bookmarksService: BookmarksService) {}

  @UseGuards(JwtAuthGuard)
  @Get()
  async getAllBookmarkedJobs(
    @Req() request: Request
  ): Promise<StandardSuccessResponse<string[]>> {
    return {
      success: true,
      data: await this.bookmarksService.getAllBookmarkedJobs(
        request.user.candidateId
      ),
      meta: null,
      message: ResponseMessage.BOOKMARKS_RETRIEVED,
    }
  }
}

strategies/jwt.strategy.ts

import { ExtractJwt, Strategy } from 'passport-jwt'
import { PassportStrategy } from '@nestjs/passport'
import { Injectable } from '@nestjs/common'

@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
  constructor() {
    super({
      jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
      ignoreExpiration: false,
      secretOrKey: process.env.JWT_SECRET,
    })
  }

  async validate(payload: any) {
    return { candidateId: payload.sub }
  }
}
4

3 回答 3

3

因为您没有从 express 导入 Request,所以只需添加:

import { Request } from 'express';

但是您需要拥有@types/passport@types/express安装它,它会起作用。

于 2020-10-09T06:56:10.833 回答
2

该属性通过或通过使用自定义接口user附加到Request对象,并自己添加类型,如下所示:@types/passportextends Request

export interface RequestWithUser extends Request {

  user: UserType;
}
于 2020-10-07T01:17:19.407 回答
-1

您应该将@Req() 更改为@Res(),因为您正在获取数据。

     @UseGuards(JwtAuthGuard)
     @Get()
     async getAllBookmarkedJobs(@Res() res): Promise<StandardSuccessResponse<string[]> {
        return {
          success: true,
          data: await this.bookmarksService.getAllBookmarkedJobs(
           res.user.candidateId
          ),
          meta: null,
          message: ResponseMessage.BOOKMARKS_RETRIEVED,
        }
     } 
于 2020-10-09T13:09:12.343 回答