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

如何在单个控制器中同时使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:36:04