【问题标题】:TS2339: Property 'user' does not exist on type 'Request'TS2339:“请求”类型上不存在属性“用户”
【发布时间】:2021-01-21 20:59:35
【问题描述】:

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

我确实关注了official Nestjs documentation on authentification,但由于遇到打字稿错误,我无法让它工作: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 }
  }
}

【问题讨论】:

    标签: typescript express nestjs jwt-auth passport-jwt


    【解决方案1】:

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

    export interface RequestWithUser extends Request {
    
      user: UserType;
    }
    

    【讨论】:

      【解决方案2】:

      因为你没有从express导入Request,所以添加:

      import { Request } from 'express';
      

      但你需要安装@types/passport@types/express,它才能工作。

      【讨论】:

        【解决方案3】:

        您应该将@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,
                }
             } 
        

        【讨论】:

        • 使用@Res()实际上会让Nest停止发送响应并要求用户使用res.send()手动处理它。除非绝对必要,否则不建议在 Nest 中使用,10 次中有 9 次有其他方法来管理响应。
        猜你喜欢
        • 2019-06-25
        • 2016-03-14
        • 2017-02-25
        • 2021-11-24
        • 2019-01-11
        • 2021-05-08
        • 2021-10-15
        • 1970-01-01
        • 2020-12-13
        相关资源
        最近更新 更多