如何在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
相关产品推荐
相关产品推荐

