TS2339:“请求”类型上不存在属性“用户”

Posted

技术标签:

【中文标题】TS2339:“请求”类型上不存在属性“用户”【英文标题】:TS2339: Property 'user' does not exist on type 'Request' 【发布时间】: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 
  

【问题讨论】:

【参考方案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 次有其他方法来管理响应。

以上是关于TS2339:“请求”类型上不存在属性“用户”的主要内容,如果未能解决你的问题,请参考以下文章

错误 TS2339:类型“”上不存在属性“包含”

错误 TS2339:类型“”上不存在属性“contenido”

TS2339:类型上不存在属性“帖子”

类型“未知”.ts(2339) 上不存在属性“名称”

TS2339:“家”类型上不存在属性“道具”

TypeScript:TS2339 错误——“对象”类型上不存在属性