我实际上的意思是,假设我有这样的代码:
var ARouter = Router();
@Validate({
params: {
id: joi.number(),
x: joi.number()
}
})
@HttpGet('/foo/:id')
foo(req: Request, res: Response) {
res.send('in foo').end();
}
function HttpGet(path: string) {
return function (target: ApiController, propertyName: string, descriptor: TypedPropertyDescriptor<RequestHandler>) {
ARouter.get(path, descriptor.value);
}
}我这里有一个路由器,一个装饰器和一个foo函数。HttpGet装饰器创建一个路径' foo /:id‘和foo作为它在ARouter中的唯一处理程序。
我希望@ called装饰器将另一个处理程序(将在foo之前调用的特定功能中间件)添加到foo路由处理程序堆栈中。例如,它是router.get('/foo/:id/,validationFunction,foo)。
是否有一种方法可以动态地向路由器中的foo路由添加处理程序?
谢谢!
发布于 2017-05-05 18:40:48
基于装潢工文件
当多个装饰器应用于单个声明时,它们的评估与数学中的函数组合类似。在该模型中,当组合函数f和g时,得到的复合(f∘g)(x)等价于f(g(x))。
所以你可以做这样的事情:
function validate(params: any, fn: (req: Request, res: Response) => void) {
// validate data here and based on that decide what to do next
}
function Validate(params: any) {
return function(target: any, propertyKey: string, descriptor: PropertyDescriptor) {
const newDescriptor = Object.assign({}, descriptor);
newDescriptor.value = function(req: Request, res: Response) {
validate(params, descriptor.value);
}
return newDescriptor;
}
}改变你的装潢师的顺序:
@HttpGet('/foo/:id')
@Validate({
params: {
id: joi.number(),
x: joi.number()
}
})
foo(req: Request, res: Response) {
res.send('in foo').end();
}(请记住,我还没有测试过)
https://stackoverflow.com/questions/43811270
复制相似问题