首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在类型记录中向Express.Request添加自定义属性?

如何在类型记录中向Express.Request添加自定义属性?
EN

Stack Overflow用户
提问于 2022-02-15 07:47:35
回答 2查看 1.7K关注 0票数 2

我很抱歉我的英语水平很差。

我使用特快专递打字稿创建了一个新项目。

$ npx速递机-打字本-用途-纱线

我想为我的自定义中间件向Express.Request添加其他属性。因此,我在types/myRequest.d.ts中创建了./src,并将代码放入并保存如下:

代码语言:javascript
运行
复制
// myRequest.d.ts
declare namespace Express {
  interface Request {
    myProp?: boolean;
  }
}

我取消了tsconfig.json中的“tsconfig.json”注释,添加了“./node_node/@type”、“./src/tsconfig.json”,并尝试通过在./src/routes/api.ts中创建一些中间件来使用添加的属性。下面是完整的代码:

代码语言:javascript
运行
复制
// api.ts
import { NextFunction, Request, Response, Router } from "express";
import userRouter from "./user-router";

function myMiddleware(req: Request, _res: Response, next: NextFunction) {
  req.myProp = true;
  next();
}

// Export the base-router
const baseRouter = Router();

// Setup routers
baseRouter.use("/users", myMiddleware, userRouter);

// Export default.
export default baseRouter;

这构建得很好,VS代码中的IntelliSense也很好,不显示任何问题。但是,当我运行yarn start:dev时,我会得到以下错误:

代码语言:javascript
运行
复制
/home/me/dev/express-gen-ts/node_modules/ts-node/src/index.ts:828
    return new TSError(diagnosticText, diagnosticCodes);
           ^
TSError: ⨯ Unable to compile TypeScript:
src/routes/api.ts:5:7 - error TS2339: Property 'myProp' does not exist on type 'Request<ParamsDictionary, any, any, ParsedQs, Record<string, any>>'.

5   req.myProp = true;
        ~~~~~~

    at createTSError (/home/me/dev/express-gen-ts/node_modules/ts-node/src/index.ts:828:12)
    at reportTSError (/home/me/dev/express-gen-ts/node_modules/ts-node/src/index.ts:832:19)
    at getOutput (/home/me/dev/express-gen-ts/node_modules/ts-node/src/index.ts:1022:36)
    at Object.compile (/home/me/dev/express-gen-ts/node_modules/ts-node/src/index.ts:1326:43)
    at Module.m._compile (/home/me/dev/express-gen-ts/node_modules/ts-node/src/index.ts:1458:30)
    at Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
    at Object.require.extensions.<computed> [as .ts] (/home/me/dev/express-gen-ts/node_modules/ts-node/src/index.ts:1462:12)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Function.Module._load (node:internal/modules/cjs/loader:822:12)
    at Module.require (node:internal/modules/cjs/loader:1005:19) {
  diagnosticCodes: [ 2339 ]
}
[nodemon] app crashed - waiting for file changes before starting...

所以我不能在开发状态下进行开发。当然,如果我不使用其他属性,那么dev状态也是可用的,并且工作正常。

我认为express-generator-typescript本身就有一些背景。因为在tsconfig.json中更改"typeRoots“并不会改变结果。但我找不到。

提前谢谢你。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-02-15 12:07:59

每当遇到这种类型的问题时,我通常使用“声明模块”向Express的“请求”接口添加属性,而不是在命名空间中声明它们。这样,我通常不需要更改tsconfig中的任何内容,也不必添加任何.d.ts文件。

将这些行添加到您的api.ts代码中(注意,在大多数情况下,您需要引用快递服务静态核心模块,因为请求接口就是在这里声明的):

代码语言:javascript
运行
复制
declare module "express-serve-static-core" {
  interface Request {
    myProp?: boolean;
  }
}

完整档案:

代码语言:javascript
运行
复制
// api.ts
import { NextFunction, Request, Response, Router } from "express";
import userRouter from "./user-router";

declare module "express-serve-static-core" {
  interface Request {
    myProp?: boolean;
  }
}

function myMiddleware(req: Request, _res: Response, next: NextFunction) {
  req.myProp = true;
  next();
}

// Export the base-router
const baseRouter = Router();

// Setup routers
baseRouter.use("/users", myMiddleware, userRouter);

// Export default.
export default baseRouter;

通常,这将使新添加的属性在其他文件中也可用,但您当然可以导出经过操作的请求接口,这样才是安全的。

票数 5
EN

Stack Overflow用户

发布于 2022-02-15 11:05:50

我建议你一条路,希望它能帮你。

在文件./src/ file /api.ts中添加以下代码(在导入下)

代码语言:javascript
运行
复制
declare global {
     namespace Express {
         interface Request {
             myProp?: boolean;
         }
     }
}

然后再运行(似乎不需要types/myRequest.d.ts文件)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71122741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档