如何在单个控制器中同时使用Express RequestHandler与inversify-express-utils BaseMiddleware
混合使用Bull Monitor与inversify-express-utils中间件的解决方案
核心兼容处理
Bull Monitor提供的Express handler本身是异步函数,不存在接口不兼容的问题:
- Express 5及以上版本原生支持异步request handler,可直接使用
- Express 4版本需要手动添加一层异步错误捕获包装,代码如下:
const asyncHandler = (fn: express.RequestHandler) => (req: express.Request, res: express.Response, next: express.NextFunction) => { Promise.resolve(fn(req, res, next)).catch(next); };
两种可行注册方案
方案1:构建后全局注册(更简单)
拿到inversify-express构建后的底层Express实例,按顺序注册鉴权中间件和Bull Monitor handler即可:
// 初始化inversify express服务 const server = new InversifyExpressServer(container); // 配置其他全局中间件 server.setConfig(app => { app.use(express.json()); // 其他全局中间件逻辑 }); const app = server.build(); // 注册Bull Monitor路由 import { createExpressHandler } from '@bull-monitor/express'; const bullHandler = createExpressHandler({ queues: [/* 你自己的Bull队列实例列表 */] }); // 路径前缀与访问路径保持一致,按顺序注册鉴权、管理员校验中间件,最后注册Bull Monitor handler app.use( '/bull-monitor', yourAuthMiddleware, // 你实现的身份认证BaseMiddleware yourAdminCheckMiddleware, // 你实现的管理员校验BaseMiddleware asyncHandler(bullHandler) // Express 5可去掉asyncHandler包裹 ); app.listen(3000);
方案2:Controller封装注册(更符合inversify规范)
你之前返回404的核心原因是路径通配不完整,需要用*匹配Bull Monitor下的所有子路径:
import { controller, Get, Post, Put, Delete, middleware } from 'inversify-express-utils'; @controller('/bull-monitor') export class BullMonitorController { // 初始化Bull Monitor handler private readonly bullHandler = asyncHandler( createExpressHandler({ queues: [/* 你的Bull队列实例列表 */] }) ); // 匹配所有请求方法和所有子路径,挂载鉴权中间件 @Get('*') @Post('*') @Put('*') @Delete('*') @middleware(yourAuthMiddleware, yourAdminCheckMiddleware) async forward(req: express.Request, res: express.Response, next: express.NextFunction) { return this.bullHandler(req, res, next); } }
注意事项
- 确保注册的路径前缀和实际访问的路径完全一致,比如注册路径为
/bull-monitor,访问地址应为http://你的服务地址/bull-monitor - 方案2必须用
*通配符匹配所有子路径,否则Bull Monitor的静态资源、内部接口请求都会返回404
内容的提问来源于stack exchange,提问作者absentUserName
相关产品推荐
相关产品推荐

