You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Express.js中存储中间件返回值供应用全局访问?

解决思路及步骤

你遇到的是TypeScript类型系统的限制——Express默认的Request类型没有你自定义的属性,所以需要扩展这个类型来解决错误,同时实现将中间件结果挂载到req供后续使用的需求。

1. 扩展Express Request类型

在项目中创建一个类型声明文件(比如src/types/express.d.ts),用来扩展Express的Request接口:

import { MyMiddlewareResponse } from '../path/to/your-interface-file';

declare global {
  namespace Express {
    interface Request {
      myMiddlewareResponse?: MyMiddlewareResponse;
    }
  }
}

注意:替换../path/to/your-interface-file为MyMiddlewareResponse接口所在文件的实际路径。

2. 配置tsconfig.json(确保类型文件被识别)

在tsconfig.json的include数组里添加你的类型文件路径,确保TypeScript能扫描到这个声明:

{
  "include": [
    "src/**/*",
    "src/types/**/*" // 这里添加你的类型文件所在目录
  ]
}

3. 修改中间件代码,挂载结果到req对象

更新你的中间件,将response赋值给req.myMiddlewareResponse:

import { myMiddlewareFunction } from "@mymiddleware";
import { MyMiddlewareResponse } from '../path/to/your-interface-file';

app.use(async function (req, res, next) {
  try {
    const params = {...someparams};
    const response: MyMiddlewareResponse = await myMiddlewareFunction(req, params);

    if (!response.isValid) {
      res.send("401: Not Valid");
      return;
    }   
    // 将结果挂载到req对象
    req.myMiddlewareResponse = response;
    next();
  } catch (err) {
    next(err);
  }
});

4. 在后续业务逻辑中访问挂载的数据

之后在路由处理函数或其他中间件里,就可以正常访问req.myMiddlewareResponse,并且TypeScript会提供正确的类型提示:

app.get('/some-route', (req, res) => {
  const storeId = req.myMiddlewareResponse?.store_id;
  const salesMan = req.myMiddlewareResponse?.salesManInfo;
  
  // 这里可以使用这些数据进行业务处理
  res.json({ storeId, salesMan });
});

内容的提问来源于stack exchange,提问作者Blueboye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 06:52:43