0

我在我的快速打字稿应用程序中输入我的请求时遇到了困难。我有这个控制器是安全的,passport-jwt所以当一个路由被认证时,我尝试从 访问用户数据,req.user并且假设有一个_id.

const newPort = { ...req.body, user: req.user?._id };

此行产生错误:

[tsserver 2339] [E] Property '_id' does not exist on type 'User'.

我该如何解决这个问题?

编辑:创建了一个扩展类型的自定义Request类型

import { Request, Response } from 'express';

interface User {
    _id: string,
}

export interface MyRequest extends Request {
    user: User
}

export type MyResponse = Response;

将其应用于管理 API 调用的控制器

import { IResponse, MyRequest, MyResponse } from '@interface';

export const Create = (req: MyRequest, res: MyResponse): void =>  {
    Rx
        .from(User.Create(req.body))
        .subscribe(
            (result: IResponse) => {
                res.status(result.status).json(result.toJson());
            },
            (error) => {
                res.status(error.status).json(error);

但是当我将它调用到我的快速路由器时。它显示一个错误。

错误: 在此处输入图像描述

错误: 在此处输入图像描述

4

1 回答 1

0

您必须扩展Request对象以适应您的自定义属性。例如,如果您的请求包含user并假设一个跟踪 ID,(很可能是通过像护照这样的中间件)创建一个扩展接口,如下所示:

import { Request } from "express";

export interface User {
  _id: string;
  email: string;
}

export interface MyRequest extends Request {
  user?: User;
  trackingId?: string;
}

现在,在任何地方都使用这种新的请求类型,如下所示:

app.get('/mypath', (req: MyRequest, res: Response) => {
  const myUserId = req.user?._id;
  ...
});
于 2020-12-28T05:40:49.307 回答