簡體   English   中英

動態將處理程序添加到快速路由功能

[英]dynamicly add handlers to an express route function

我的實際意思是,假設我有以下代碼:

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中唯一處理程序的路由。

我希望@validate裝飾器將另一個處理程序(特定功能中間件,將在foo之前調用)添加到foo路由處理程序堆棧中。 例如,就像是router.get('/ foo /:id /,validationFunction,foo)。

有沒有辦法在路由器的foo路由中動態添加處理程序?

謝謝!

根據裝飾器文檔

當多個修飾符應用於一個聲明時,其求值類似於數學中的函數組成。 在這個模型中,當組合函數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();
}

(請記住,我還沒有測試過)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM