2017-03-04 29 views
1

目前,我有我的應用程序兩條路線:從貓鼬的發票憑證的節點快車 - 路由路徑結腸的參數異常

/invoice/:invoice返回JSON數據

/invoice/preview返回一個HTML模板內的發票預覽(注意,這並不總是預覽現有的發票,也有可能是不存在的,其中它的數據是通過URL參數提供的,這就是爲什麼路由不能被/invoice/:invoice/preview

問題

應該有更好的方法來聲明這兩個特定的路由,因爲/invoice/preview路由現在調用這兩個處理程序,因爲它與兩個正則表達式匹配。

如果我們在CSS選擇器/invoice/:invoice:not(preview)談話將是我想要的行爲。不幸的是,我沒有找到任何文件。

有什麼辦法來實現這個或任何方式來改善這個端點結構?

回答

2

申報具體路由第一:

router.get('/invoice/preview', ...); 

router.get('/invoice/:invoice', ...); 

快速檢查航線聲明的順序,因此一旦它匹配對/invoice/preview的請求(和條件是其處理程序發回響應)時,無特定/invoice/:invoice將不被考慮。

另外,如果:invoice應該始終與一個特定的模式(比如一個MongoDB的ObjectId),可以將路線限制爲匹配模式的請求:

router.get('/invoice/:invoice([a-fA-F0-9]{24})', ...); 

這種模式不匹配「預覽」 ,所以在這種情況下,順序並不重要。

如果無法做到這一點,你可以創建一箇中間件,並會檢查是否匹配req.params.invoice「預覽」,如果是這樣,將沿請求還傳下的處理程序鏈:

let notIfPreview = (req, res, next) => { 
    if (req.params.invoice === 'preview') return next('route'); 
    next(); 
}; 

router.get('/invoice/:invoice', notIfPreview, ...); 
router.get('/invoice/preview', ...); 

(記錄here

+0

您的第一個解決方案並不理想,因爲由於項目設置,較不具體的將首先聲明。然而,正則表達式的解決方案是完美的! –

+1

@KeesvanLierop只是爲了完整起見,如果無法爲':invoice'創建模式,那麼我的答案中還會添加另一個解決方案。 – robertklep