首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态地将处理程序添加到快速路由函数中

动态地将处理程序添加到快速路由函数中
EN

Stack Overflow用户
提问于 2017-05-05 18:05:48
回答 1查看 112关注 0票数 2

我实际上的意思是,假设我有这样的代码:

代码语言:javascript
复制
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路由添加处理程序?

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-05 18:40:48

基于装潢工文件

当多个装饰器应用于单个声明时,它们的评估与数学中的函数组合类似。在该模型中,当组合函数f和g时,得到的复合(f∘g)(x)等价于f(g(x))。

所以你可以做这样的事情:

代码语言:javascript
复制
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;
    }
}

改变你的装潢师的顺序:

代码语言:javascript
复制
@HttpGet('/foo/:id')
@Validate({
    params: {
        id: joi.number(),
        x: joi.number()
    }
})
foo(req: Request, res: Response) {
    res.send('in foo').end();
}

(请记住,我还没有测试过)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43811270

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档