当前位置: 首页 > 知识库问答 >
问题:

express:project local中间件扩展express。要求

康赞
2023-03-14

我正在开发一个基于express的节点服务器,它是用TypeScript 1.7编写的。我正在使用一些特定于项目的中间件,这些中间件扩展了现有的express请求或响应接口,但我还无法使其完全工作(tsc抱怨在reqres中找不到X)。我发现了关于这个问题的其他问题,但它们要么已经过时(我想),要么解决方案不直接。

我查看了现有中间件的定义,但如果不手动编写单独的d.ts文件并在typings/tsd中引用它们,我就无法使其工作。d、 ts.这是我的设置:

// middleware/foobar.ts
declare module Express {
  export interface Request {
    foobar?: string;
  }
}

/* my project-related middleware extends the request by `foobar` */
export = function(req: Express.Request, res, next) {
  req.foobar = 'FooBar';
  next();
};

// main.ts
import express = require('express');

var app = express();

app.use(require('./middleware/foobar'));

app.get('/foobar', (req, res) => {
  /* tsc: Property 'foobar' does not exist on type 'Request' */
  res.send(req.foobar);
});

扩展express的请求和响应接口的最佳实践是什么?如果可能的话,不需要编写单独的d.T,操作typings目录中的任何内容或使用///


共有1个答案

梁鸿风
2023-03-14

我自己找到了一个解决方案,用这个例子作为参考。我的中间件需要包装在一个声明的模块中,所以中间件/foobar.ts看起来像这样:

declare module Express {
  export interface Request {
    foobar?: string;
  }
}

declare module 'foobar' {
  function foobar(req: Express.Request, res, next) {
    req.foobar = 'FooBar';
    next();
  }

  export = foobar;
}

如果您在中间件中使用类或其他导入的东西,那么就更加复杂了。在我的示例中,我的中间件使用我自己的“EntityManager”类,这是对数据库连接的抽象(对我来说是mysql)。我的中间件(对我来说是中间件/数据库。ts)现在看起来像这样:

declare module Express {
  import { Manager as EntityManager } from 'entity-manager';

  export interface Request {
    entityManager?: EntityManager;
  }
}

declare module 'database' {
  import * as mysql from 'mysql';
  import { Manager as EntityManager } from 'entity-manager';

  /* some middleware-related code */
  var pool = mysql.createPool(...);
  var entityManager = new EntityManager(pool);
  /* *** */


  /* the actual exported function */
  function database(req: Express.Request, res, next) {
    req.entityManager = entityManager;
    next();
  };

  export = database;
}

注意,我的EntityManager类被导入了两次,每个模块声明一次。仅仅在两个模块上导入它似乎不起作用。

更新

将实际代码放在声明的模块中(在我的例子中是“数据库”)不会在JS文件中产生任何输出。

在常规模块中包含该代码需要名称不使用撇号(例如,此处不允许使用连字符),并且也不会生成单函数导出代码。

将实际代码完全从模块中取出(因此只有带有扩展请求的声明的Express模块)可以生成正确的JS,但我的文本编辑器在req中再也找不到entityManager。

似乎我需要将打字(例如我自己的扩展名来表示请求)放入一个专用的d.ts文件中,在这个文件中没有实际的代码。

 类似资料:
  • 这个问题已经被问了好几次了,但没有一个答案对我有效。我试图扩展Express请求对象,使其包含一个属性来存储用户对象。我创建了一个声明文件,

  • Express middleware The Express middleware modules listed here are maintained by the Expressjs team. Middleware module Description Replaces built-in function (Express 3) body-parser Parse HTTP request

  • 问题内容: 我在我的应用程序中使用了express以及body-parser。 但是,express 4.0中的“扩展”是什么意思? 我找到了这个 但是,我仍然不能理解它的含义。 问题答案: 如果为,则不能发布“嵌套对象” 如果为,则可以按照自己喜欢的方式进行操作。

  • 我安装laravel通过作曲家,但当运行的网站它给一个错误 我也安装了php5-mcrypt,但错误仍然存在。

  • 问题内容: 我正在尝试添加一个属性以使用Typescript从中间件表达请求对象。但是我不知道如何向对象添加额外的属性。如果可能的话,我宁愿不使用括号符号。 我正在寻找一种解决方案,允许我编写与此类似的内容(如果可能): 问题答案: 您想要创建一个自定义定义,并在Typescript中使用一个称为声明合并的功能。这是常用的,例如在中。 创建一个文件,并确保将其包含在您的-部分中(如果有)。内容如下

  • 如果默认的调度器不满足要求,还可以部署自定义的调度器。并且,在整个集群中还可以同时运行多个调度器实例,通过 podSpec.schedulerName 来选择使用哪一个调度器(默认使用内置的调度器)。 开发自定义调度器 自定义调度器主要的功能是查询未调度的 Pod,按照自定义的调度策略选择新的 Node,并将其更新到 Pod 的 Node Binding 上。 比如,一个最简单的调度器可以用 sh