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:“请求”类型上不存在属性“用户”的主要内容,如果未能解决你的问题,请参考以下文章