InversifyJS - 将中间件注入控制器

时间:2016-09-22 06:50:49

标签: inversifyjs

我在节点应用程序中使用快捷装饰器(@GET,@ POST ...)来使用inversify-express-utils。

是否可以将中间件注入控制器以与这些装饰器一起使用?

我想要实现的目标(不起作用)的例子:

export class TestController implements Controller {
    constructor(@inject(TYPES.SomeMiddleware) private someMiddleware: ISomeMiddleware) {}

    @Get('/', this.someMiddleware.someMiddlewhereMethod())
    public test() {
       ...
    }

}

2 个答案:

答案 0 :(得分:3)

就像@OweR ReLoaDeD所说,目前你不能通过控制器构造函数注入中间件,因为装饰器在TypeScript中工作的方式。

但是,您可以通过将控制器定义包装在接受内核的函数中来实现相同的效果,如下所示:

controller.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 repo添加了一个示例,它使用自定义和第三方中间件展示了这种方法。

答案 1 :(得分:1)

您应该可以使用中间件,请参阅the following unit tests as an example

更新

我认为这是不可能的,因为在声明类时会执行装饰器。构造函数注入在创建类实例时发生(在声明它之后)。这意味着,当执行装饰器时,this.someMiddleware为空。

我担心您无法将中间件注入使用它的同一个类中,但您可以执行以下操作:

import { someMiddlewareMethod} from "middleware";

class TestController implements Controller {

    @Get('/', someMiddlewareMethod())
    public test() {
       // ...
    }

}

这不是InversifyJS的限制,这是装饰工作方式造成的限制。