3

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

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

我正在尝试实现的示例(不起作用):

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

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

}
4

2 回答 2

4

就像@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 存储库中添加了一个示例,该示例展示了使用自定义和第三方中间件的这种方法。

于 2016-09-24T05:33:40.337 回答
2

您应该可以使用中间件,请参考以下单元测试作为示例

更新

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

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

import { someMiddlewareMethod} from "middleware";

class TestController implements Controller {

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

}

这不是 InversifyJS 的限制,这是由装饰器工作方式引起的限制。

于 2016-09-22T23:19:08.977 回答