【问题标题】:Extend Express Request object using Typescript使用 Typescript 扩展 Express Request 对象
【发布时间】:2016-09-19 13:13:56
【问题描述】:

我正在尝试添加一个属性以使用 typescript 从中间件表达请求对象。但是我不知道如何为对象添加额外的属性。如果可能的话,我宁愿不使用括号表示法。

我正在寻找一种解决方案,可以让我写出类似的东西(如果可能的话):

app.use((req, res, next) => {
    req.property = setProperty(); 
    next();
});

【问题讨论】:

  • 你应该可以用你想要的字段扩展express.d.ts文件提供的请求接口。

标签: node.js express typescript


【解决方案1】:

您想要创建自定义定义,并使用 Typescript 中称为 Declaration Merging 的功能。这是常用的,例如在method-override

创建一个文件custom.d.ts 并确保将其包含在您的tsconfig.jsonfiles 部分中(如果有)。内容如下:

declare namespace Express {
   export interface Request {
      tenant?: string
   }
}

这将允许您在代码中的任何位置使用如下内容:

router.use((req, res, next) => {
    req.tenant = 'tenant-X'
    next()
})

router.get('/whichTenant', (req, res) => {
    res.status(200).send('This is your tenant: '+req.tenant)
})

【讨论】:

  • 我刚刚做了这个,但是我没有将我的 custom.d.ts 文件添加到我的 tsconfig.json 中的文件部分,但它仍然有效。这是预期的行为吗?
  • @ChaimFriedman 是的。 files 部分限制了 TypeScript 包含的文件集。如果您不指定filesinclude,则默认包含所有*.d.ts,因此无需在此处添加自定义类型。
  • 不适合我:我得到 Property 'tenant 不存在于类型“请求”`如果我明确地将它包含在 tsconfig.json 中没有区别。 更新declare global@basarat 在他的 answear 作品中指出,但我必须先做import {Request} from 'express'
  • FWIW,这个答案现在过时了。 JCM 的答案是在 expressjs 中扩充 Request 对象的正确方法(至少 4.x)
  • 对于未来的搜索 - 我发现一个很好的例子,开箱即用:github.com/3mard/ts-node-example
【解决方案2】:

按照comments in the index.d.ts 的建议,您只需向全局Express 命名空间声明任何新成员。示例:

declare global {
  namespace Express {
    interface Request {
      context: Context
    }
  }
}

完整示例:

import * as express from 'express';

export class Context {
  constructor(public someContextVariable) {
  }

  log(message: string) {
    console.log(this.someContextVariable, { message });
  }
}

declare global {
  namespace Express {
    interface Request {
      context: Context
    }
  }
}

const app = express();

app.use((req, res, next) => {
  req.context = new Context(req.url);
  next();
});

app.use((req, res, next) => {
  req.context.log('about to return')
  res.send('hello world world');
});

app.listen(3000, () => console.log('Example app listening on port 3000!'))

more at my GitBook 涵盖了扩展全局命名空间。

【讨论】:

  • 为什么声明中需要全局?如果它不存在会怎样?
  • 这适用于接口,但如果有人需要合并类型,请注意类型是“关闭的”并且无法合并:github.com/Microsoft/TypeScript/issues/…
  • @basarat 先生,我欠你一些啤酒。
  • 我还必须添加到我的 tsconfig.json: { "compilerOptions": { "typeRoots": ["./src/typings/", "./node_modules/@types"] }, “文件”:[“./src/typings/express/index.d.ts”] }
  • 上述解决方案都不起作用..但是这个在第一次运行时完成了工作..非常感谢..!!
【解决方案3】:

对于较新版本的 express,您需要扩充 express-serve-static-core 模块。

这是必需的,因为现在 Express 对象来自那里:https://github.com/DefinitelyTyped/DefinitelyTyped/blob/8fb0e959c2c7529b5fa4793a44b41b797ae671b9/types/express/index.d.ts#L19

基本上,使用以下内容:

declare module 'express-serve-static-core' {
  interface Request {
    myField?: string
  }
  interface Response {
    myField?: string
  }
}

【讨论】:

  • 这对我有用,而扩展普通的 'express' 模块却没有。谢谢!
  • 一直在努力解决这个问题,为了让它工作,我还必须导入模块:import {Express} from "express-serve-static-core";
  • @andre_b 感谢您的提示。我认为 import 语句将文件转换为模块,这是必要的部分。我已经改用export {},它也可以使用。
  • 确保此代码进入的文件称为express.d.ts,否则编译器会尝试将其合并到快速类型中,从而导致错误。跨度>
  • 确保您的类型必须在 typeRoots 中排在第一位! types/express/index.d.ts 和 tsconfig => "typeRoots": ["./src/types", "./node_modules/@types"]
【解决方案4】:

尝试了 8 个左右的答案并没有成功。我终于设法让它与 jd291 指向 3mards repo 的评论一起工作。

在名为types/express/index.d.ts 的基础中创建一个文件。并在其中写道:

declare namespace Express {
    interface Request {
        yourProperty: <YourType>;
    }
}

并将其包含在tsconfig.json 中:

{
    "compilerOptions": {
        "typeRoots": ["./types"]
    }
}

那么yourProperty 应该可以在每个请求下访问:

import express from 'express';

const app = express();

app.get('*', (req, res) => {
    req.yourProperty = 
});

【讨论】:

  • 适用于 Express v4.17.1 和 typescript v4.3.4
  • 如果我想用不同的自定义 props 自定义不同的请求怎么办?
  • 需要将命名空间包装在 declare global {} 中,这样就可以了。
  • 这适用于添加新属性,但我需要覆盖现有属性。我该怎么做?
  • @MattGoodwin,我也必须这样做。但你能解释一下原因吗?
【解决方案5】:

接受的答案(与其他人一样)对我不起作用,但

declare module 'express' {
    interface Request {
        myProperty: string;
    }
}

做到了。希望对某人有所帮助。

【讨论】:

  • 类似的方法在ts docs 中的“Module Augmentation”中进行了描述。如果您不想使用 *.d.ts 文件并将您的类型存储在常规 *.ts 文件中,那就太好了。
  • 这也是唯一对我有用的东西,所有其他答案似乎都需要在 .d.ts 文件中
  • 这也适用于我,前提是我将 custom-declarations.d.ts 文件放在 TypeScript 的项目根目录中。
  • 我扩展了原始类型以保留它:import { Request as IRequest } from 'express/index';interface Request extends IRequest。还必须添加 typeRoot
  • 在尝试了每一个答案之后,这是唯一对我有用的答案。现在,我不得不将它直接添加到我的主文件中,我希望我能找到另一种更清洁的方法。
【解决方案6】:

所提供的解决方案都不适合我。我最终只是简单地扩展了 Request 接口:

import {Request} from 'express';

export interface RequestCustom extends Request
{
    property: string;
}

然后使用它:

import {NextFunction, Response} from 'express';
import {RequestCustom} from 'RequestCustom';

someMiddleware(req: RequestCustom, res: Response, next: NextFunction): void
{
    req.property = '';
}

编辑:根据您的 tsconfig,您可能需要这样做:

someMiddleware(expressRequest: Request, res: Response, next: NextFunction): void
{
    const req = expressRequest as RequestCustom;
    req.property = '';
}

【讨论】:

  • 这会起作用,但如果你有 100 多个中间件函数会很冗长,amirite
  • 从 2020 年 10 月 1 日起,似乎创建了一个从 Express 本身扩展 Response/Request 接口的新接口,应该可以正常工作。我有interface CustomResponse extends Response { customProperty: string},我称之为someMiddleware(res: CustomResponse),它工作正常,可以访问Response 和新定义的接口上存在的属性。
  • 我更喜欢这种方法,它比在幕后默默地扩展请求对象更加明确和清晰。明确哪些属性是你的,哪些来自源模块
  • “取决于你的 tsconfig”——取决于 tsconfig 的什么属性?我想相应地更改它以便能够使用界面解决方案。为什么默认情况下这不起作用,对我来说似乎有点违反 OOP 的规则..
  • Req 没有被类型“修改”。它始终是同一个对象,接口声明只允许您以类型安全的方式向对象添加其他属性。
【解决方案7】:

所有这些响应似乎都是错误的或以某种方式过时。

这在 2020 年 5 月对我有用:

${PROJECT_ROOT}/@types/express/index.d.ts:

import * as express from "express"

declare global {
    namespace Express {
        interface Request {
            my_custom_property: TheCustomType
        }
    }
}

tsconfig.json 中,添加/合并属性使得:

"typeRoots": [ "@types" ]

干杯。

【讨论】:

  • 与 Webpack + Docker 一起使用,import* 可以替换为 export {};
  • 不起作用。 Property 'user' does not exist on type 'Request'.
  • 这里也一样,你解决了吗@OliverDixon?
【解决方案8】:

替代解决方案

这实际上并没有直接回答这个问题,但我提供了一个替代方案。我一直在为同样的问题苦苦挣扎,并尝试了此页面上的几乎所有接口扩展解决方案,但都没有奏效。

这让我停下来思考:我为什么要修改请求对象?

使用response.locals

Express 开发人员似乎认为用户可能想要添加自己的属性。这就是为什么有一个locals 对象。问题是,它不在 request 中,而是在 response 对象中。

response.locals 对象可以包含您可能想要的任何自定义属性,封装在请求-响应周期中,因此不会暴露给来自不同用户的其他请求。

需要存储用户 ID?只需设置response.locals.userId = '123'。无需为打字而苦恼。

它的缺点是您必须传递响应对象,但很可能您已经在这样做了。

https://expressjs.com/en/api.html#res.locals

打字

另一个缺点是缺乏类型安全性。但是,您可以使用 Response 对象上的泛型类型来定义 bodylocals 对象的结构:

Response&lt;MyResponseBody, MyResponseLocals&gt;

https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/express/index.d.ts#L127

注意事项

您不能真正保证 userId 属性确实存在。您可能需要在访问它之前进行检查,尤其是在对象的情况下。

使用上面的例子添加一个 userId,我们可以有这样的东西:

interface MyResponseLocals {
  userId: string;
}

const userMiddleware = (
  request: Request,
  response: Response<MyResponseBody, MyResponseLocals>,
  next: NextFunction
) => {
  const userId: string = getUserId(request.cookies.myAuthTokenCookie);
  // Will nag if you try to assign something else than a string here
  response.locals.userId = userId;
  next();
};

router.get(
  '/path/to/somewhere',
  userMiddleware,
  (request: Request, response: Response<MyResponseBody, MyResponseLocals>) => {
    // userId will have string type instead of any
    const { userId } = response.locals;

    // You might want to check that it's actually there
    if (!userId) {
      throw Error('No userId!');
    }
    // Do more stuff
  }
);

【讨论】:

  • 一个更显着的缺点是response.locals 仍然没有类型。其中存储的任何值都是any
  • 这是非常正确的,但我很乐意接受它作为一种权衡。
  • 由于 Request 和 Response 在定义上是 Genereics,因为已经为此定义了本地人,所以这应该是公认的答案。我不同意 Martti Laine 的观点,Response.locals 应该使用这种方法进行强类型化。但是您必须指定“interface MyResponseLocals extends Record{...}”以匹配通用约束
【解决方案9】:

虽然这是一个非常古老的问题,但我最近偶然发现了这个问题。接受的答案工作正常,但我需要向Request 添加一个自定义接口——我在代码中一直使用的接口,但没有与接受的答案一起工作得很好。从逻辑上讲,我试过这个:

import ITenant from "../interfaces/ITenant";

declare namespace Express {
    export interface Request {
        tenant?: ITenant;
    }
}

但这不起作用,因为 Typescript 将 .d.ts 文件视为全局导入,并且当它们具有导入时,它们被视为普通模块。这就是为什么上面的代码在标准打字稿设置上不起作用的原因。

这就是我最终做的事情

// typings/common.d.ts

declare namespace Express {
    export interface Request {
        tenant?: import("../interfaces/ITenant").default;
    }
}
// interfaces/ITenant.ts

export interface ITenant {
    ...
}

【讨论】:

  • 这适用于我的主文件,但不适用于我的路由文件或控制器,我没有得到任何 linting,但是当我尝试编译它时说“属性 'user' 在类型 'Request' 上不存在。” (我使用的是用户而不是租户),但是如果我在它们上方添加 // @ts-ignore ,那么它就可以工作(尽管这当然是一种愚蠢的修复方法。你有什么想法为什么它可能不是为我的其他文件工作?
  • 这是一件很奇怪的事情@Logan。你能分享你的.d.tstsconfig.json 和使用实例吗?另外,您使用的是什么版本的打字稿,因为仅从 TS 2.9 开始支持在全局模块中导入?这可能会有所帮助。
  • 我已经在这里上传了数据,pastebin.com/0npmR1Zr我不知道为什么突出显示全部搞砸了这是来自主文件prnt.sc/n6xsyl这是来自另一个文件prnt.sc/n6xtp0显然有些它的一部分了解发生了什么,但编译器不了解。我正在使用 3.2.2 版的打字稿
  • 令人惊讶的是,... "include": [ "src/**/*" ] ... 对我有用,但 "include": ["./src/", "./src/Types/*.d.ts"], 没有。我还没有深入了解这一点
  • 使用动态导入导入接口对我有用。谢谢
【解决方案10】:

在 express 4.17.1 中,https://stackoverflow.com/a/55718334/9321986https://stackoverflow.com/a/58788706/9321986 的组合起作用了:

types/express/index.d.ts:

declare module 'express-serve-static-core' {
    interface Request {
        task?: Task
    }
}

tsconfig.json:

{
    "compilerOptions": {
        "typeRoots": ["./types"]
    }
}

【讨论】:

  • 终于找到了一个有用的:)
  • 这对我有用!
【解决方案11】:

在 TypeScript 中,接口是开放式的。这意味着您可以从任何地方通过重新定义它们来向它们添加属性。

考虑到您正在使用这个express.d.ts 文件,您应该能够重新定义Request 接口以添加额外的字段。

interface Request {
  property: string;
}

那么在你的中间件函数中,req 参数也应该有这个属性。您应该能够在不更改代码的情况下使用它。

【讨论】:

  • 如何在整个代码中“共享”这些信息?如果我在 Request 中定义了一个属性,在 app.ts 中说 Request.user = {}; userController.ts 是如何知道它的?
  • @Nepoxx 如果您重新定义接口,编译器将合并属性并使它们在任何地方可见,这就是原因。理想情况下,您会在 .d.ts 文件中进行重新定义。 :)
  • 这似乎有效,但是如果我使用 express.Handler 类型(而不是手动指定 (req: express.Request, res: express.Response, next: express.NextFunction) =&gt; any)),它似乎并没有引用相同的 Request,因为它抱怨我的财产不存在。
  • 我不希望它,除非 express.Handler 扩展了 Request 接口。是吗?
  • 如果我使用declare module "express",我可以做到这一点,但如果我使用declare namespace Express,就不行。我宁愿使用命名空间语法,但它对我不起作用。
【解决方案12】:

如果您正在寻找与 express4 一起使用的解决方案,这里是:

@types/express/index.d.ts: --------必须是/index.d.ts

declare namespace Express { // must be namespace, and not declare module "Express" { 
  export interface Request {
    user: any;
  }
}

tsconfig.json:

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es2016",
    "typeRoots" : [
      "@types", // custom merged types must be first in a list
      "node_modules/@types",
    ]
  }
}

来自https://github.com/TypeStrong/ts-node/issues/715#issuecomment-526757308的参考

【讨论】:

  • Cannot find module 'express' or its corresponding type declarations.
  • 谢谢。花了 2 天时间试图解决这个问题
【解决方案13】:

这对我使用 Nestjs 和 Express 时有用。截至 2020 年 11 月。

创建一个文件:./@types/express-serve-static-core/index.d.ts

注意:必须有上面的路径和文件名。这样Typescript声明合并才会起作用。

import { UserModel } from "../../src/user/user.model";

declare global{
    namespace Express {
        interface Request {
            currentUser: UserModel
        }
    }
}

将此添加到您的 tsconfig.json

"typeRoots": [
      "@types",
      "./node_modules/@types",
    ]        

【讨论】:

  • 出于某种原因,只有您的解决方案几乎对我有用。只是除非我直接声明Express 没有global,否则它不会起作用。
  • @Danry declare global 仅当您在同一 *.d.ts 文件中导入任何模块时才需要
【解决方案14】:

这个答案对那些依赖npm包ts-node的人会有所帮助。

我也在为扩展 request 对象而苦苦挣扎,我在堆栈溢出中遵循了很多答案,并以遵循下面提到的策略结束。

我在以下目录中声明了 express 的扩展类型。 ${PROJECT_ROOT}/api/@types/express/index.d.ts

declare namespace Express {
  interface Request {
    decoded?: any;
  }
}

然后将我的tsconfig.json 更新为类似的内容。

{
  "compilerOptions": {
     "typeRoots": ["api/@types", "node_modules/@types"]
      ...
  }
}

即使执行了上述步骤,Visual Studio 也停止了抱怨,但不幸的是,ts-node 编译器仍然习惯于抛出。

 Property 'decoded' does not exist on type 'Request'.

显然,ts-node 无法找到 request 对象的扩展类型定义。

最终在花费数小时后,我知道 VS Code 没有抱怨并且能够找到打字定义,这意味着 ts-node 编译器有问题。

package.json 中更新开始script 为我修复了它。

"start": "ts-node --files api/index.ts",

--files 参数在这里起到了决定自定义类型定义的关键作用。

更多信息请访问:https://github.com/TypeStrong/ts-node#help-my-types-are-missing

【讨论】:

  • ts-node 的 --files 标志是我无法让合并类型为我工作的缺失部分。
  • @DavidPooley 很高兴它对你有用,谢谢你的写作:)
【解决方案15】:

在 2020 年 5 月下旬尝试扩展 ExpressJS 的请求时,帮助那些只是在这里尝试其他东西的人对我有用。在让它发挥作用之前,我必须尝试十几件事:

  • 在 tsconfig.json 的“typeRoots”中翻转大家推荐的顺序(如果 tsconfig 中有 rootDir 设置,例如“./src”,请不要忘记删除 src 路径)。示例:
"typeRoots": [
      "./node_modules/@types",
      "./your-custom-types-dir"
]
  • 自定义扩展示例 ('./your-custom-types-dir/express/index.d.ts")。根据我的经验,我必须使用内联导入和默认导出才能将类用作类型也显示:
declare global {
  namespace Express {
    interface Request {
      customBasicProperty: string,
      customClassProperty: import("../path/to/CustomClass").default;
    }
  }
}
  • 更新您的 nodemon.json 文件以将“--files”命令添加到 ts-node,例如:
{
  "restartable": "rs",
  "ignore": [".git", "node_modules/**/node_modules"],
  "verbose": true,
  "exec": "ts-node --files",
  "watch": ["src/"],
  "env": {
    "NODE_ENV": "development"
  },
  "ext": "js,json,ts"
}

【讨论】:

  • 我是 2021 年的。还是不行
【解决方案16】:

也许这个问题已经回答了,但我想分享一点, 现在有时像其他答案这样的界面可能有点过于严格, 但我们实际上可以维护所需的属性,然后通过创建一个类型为 string 且值类型为 any 的键来添加要添加的任何其他属性

import { Request, Response, NextFunction } from 'express'

interface IRequest extends Request {
  [key: string]: any
}

app.use( (req: IRequest, res: Response, next: NextFunction) => {
  req.property = setProperty();

  next();
});

所以现在,我们还可以为这个对象添加任何我们想要的附加属性。

【讨论】:

  • 这个对我有用。
【解决方案17】:

如果您尝试了所有答案但仍然无法正常工作,这里有一个简单的技巧

app.use((req, res, next) => {
    (req as any).property = setProperty(); 
    next();
});

这会将req 对象转换为any,因此您可以添加任何您想要的属性。 请记住,这样做您将失去 req 对象的类型安全性。

【讨论】:

    【解决方案18】:

    一种可能的解决方案是使用“双重强制转换”

    1- 用你的属性定义一个接口

    export interface MyRequest extends http.IncomingMessage {
         myProperty: string
    }
    

    2-双重投射

    app.use((req: http.IncomingMessage, res: http.ServerResponse, next: (err?: Error) => void) => {
        const myReq: MyRequest = req as any as MyRequest
        myReq.myProperty = setProperty()
        next()
    })
    

    双重铸造的优点是:

    • 输入可用
    • 它不会污染现有定义,而是扩展它们,避免混淆
    • 由于强制转换是显式的,它使用-noImplicitany 标志编译罚款

    另外,还有快速(无类型)路线:

     req['myProperty'] = setProperty()
    

    (不要使用您自己的属性编辑现有定义文件 - 这是不可维护的。如果定义错误,请打开拉取请求)

    编辑

    见下面的评论,在这种情况下简单的铸造工作req as MyRequest

    【讨论】:

    • @akshay 在这种情况下,是的,因为MyRequest 扩展了http.IncomingMessage。如果不是这样,通过any 进行双重转换将是唯一的选择
    • 建议你投到unknown而不是any。
    • 不幸的是,像这样的铸造需要在链中的每个后续函数中进行相同的重复铸造。例如 middleware1、middleware2、middleware3 和路由本身。但这是我发现的唯一实现上下文相关类型的实现,而不仅仅是全局扩展 Request 并将所有可能的属性放在上面。
    【解决方案19】:

    在带有节点 12.19.0 和 express 4 的 mac 上,使用 Passport 进行身份验证,我需要扩展我的 Session 对象

    与上述类似,但略有不同:

    import { Request } from "express";
    
    
    declare global {
      namespace Express {
        export interface Session {
          passport: any;
          participantIds: any;
          uniqueId: string;
        }
        export interface Request {
          session: Session;
        }
      }
    }
    
    export interface Context {
      req: Request;
      user?: any;
    }```
    

    【讨论】:

      【解决方案20】:

      对我有用的简单解决方案是创建一个扩展 express Request 的新自定义接口。 这个接口应该包含你所有的自定义 req 属性作为可选的。 将此接口设置为中间件req的类型。

      // ICustomRequset.ts
         import { Request } from "express"
         export default interface ICustomRequset extends Request {
             email?: string;
             roles?: Array<string>;
         }
      
      // AuthMiddleware.ts
      ...
      export default async function (
        req: ICustomRequset,
        res: Response,
        next: NextFunction
      ) {
        try {
            // jwt code
            req.email=jwt.email
            req.roles=jwt.roles
            next()
        }catch(err){}
      

      【讨论】:

      • 这个问题是关于向现有请求接口添加自定义属性,只能使用类型声明文件来完成。
      • @AbhishekPankar 为什么你会说扩展只能使用类型声明文件来完成? @AshiSultan 的实现对我来说看起来不错。诚然,我无法让它工作。 Typescript 不喜欢在最终路由上应用此中间件。No overload matches this call
      【解决方案21】:

      这个答案可能已经很晚了,但无论如何我是这样解决的:

      1. 确保您的类型源包含在您的 tsconfig 文件中(这可能是一个全新的线程)
      2. 在您的类型目录中添加一个新目录并将其命名为您要扩展或为其创建类型的包。在这种特定情况下,您将创建一个名为 express 的目录
      3. express 目录中创建一个文件并将其命名为index.d.ts(必须完全一样)
      4. 最后要对类型进行扩展,您只需输入如下代码:
      declare module 'express' {
          export interface Request {
              property?: string;
          }
      }
      

      【讨论】:

        【解决方案22】:

        我使用response.locals 对象来存储新属性。这是完整的代码

        export function testmiddleware(req: Request, res: Response, next: NextFunction) {
            res.locals.user = 1;
            next();
        }
        
        // Simple Get
        router.get('/', testmiddleware, async (req: Request, res: Response) => {
            console.log(res.locals.user);
            res.status(200).send({ message: `Success! ${res.locals.user}` });
        });
        

        【讨论】:

          【解决方案23】:

          我也有同样的问题,可以这样解决:

          // /src/types/types.express.d.ts
          declare namespace Express {
              export interface Request {
                  user: IUser
              }
          }
          

          但需要一些条件!

          1. 添加到tsconfig.json配置
          "paths": {
              "*": [
                  "node_modules/*",
                  "src/types/*"
              ]
          },
          

          在此之后 tsc 将构建捆绑包,但 ts-node 不会。

          1. 您必须将--files 添加到编译器命令中
          ts-node --files src/server.ts
          

          【讨论】:

            【解决方案24】:

            这对我有用:

            declare namespace e {
                export interface Request extends express.Request {
                    user:IUserReference,
                    [name:string]:any;
                }
                export interface Response extends express.Response {
                    [name:string]:any;
                }
            }
            
            
            
            export type AsyncRequestHandler = (req:e.Request, res:e.Response, logger?:Logger) => Promise<any>|Promise<void>|void;
            export type AsyncHandlerWrapper = (req:e.Request, res:e.Response) => Promise<void>;
            

            我在代码中使用了它,例如以这种方式导出具有此类签名的函数:

            app.post('some/api/route', asyncHandlers(async (req, res) => {
                    return await serviceObject.someMethod(req.user, {
                        param1: req.body.param1,
                        paramN: req.body.paramN,
                        ///....
                    });
                }));
            

            【讨论】:

              【解决方案25】:

              只需将属性添加到 req.params 对象。

              req.params.foo = "bar"
              

              【讨论】:

              • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
              猜你喜欢
              • 2015-11-05
              • 2021-06-11
              • 2021-05-30
              • 2017-02-26
              • 2021-06-05
              • 1970-01-01
              • 2021-10-23
              • 2021-01-07
              • 1970-01-01
              相关资源
              最近更新 更多