就像@OweR ReLoaDeD 说的那样,由于装饰器在 TypeScript 中的工作方式,目前你不能通过控制器构造函数注入中间件来做到这一点。
但是,您可以通过将控制器定义包装在接受内核的函数中来实现相同的效果,如下所示:
控制器.ts
export function controllerFactory (kernel: Kernel) {
@injectable()
@Controller('/')
class TestController {
constructor() {}
@Get('/', kernel.get<express.RequestHandler>('Middleware'))
testGet(req: any, res: any) {
res.send('hello');
}
}
return TestController;
}
main.ts
let kernel = new Kernel();
let middleware: express.RequestHandler = function(req: any, res: any, next: any) {
console.log('in middleware');
next();
};
kernel.bind<express.RequestHandler>('Middleware').toConstantValue(middleware);
let controller = controllerFactory(kernel);
kernel.bind<interfaces.Controller>(TYPE.Controller).to(controller).whenTargetNamed('TestController');
let server = new InversifyExpressServer(kernel);
// ...
更新
我在inversify-express-examples 存储库中添加了一个示例,该示例展示了使用自定义和第三方中间件的这种方法。