2013-07-02 76 views
1

我有兩種情況,從DBExpress.js路由與可選參數?

獲取數據
  1. 正常顯示數據

    http://exampleapp.com/task/{{taskId}} 
    
  2. 要通過張貼

    http://exampleapp.com/task/{{taskId}}/?state={{app.state}} 
    

兩個網址具有相同的數據進行編輯, http://exampleapp.com/task/{{taskId}}與最後一句短語略有不同

我用快遞路由如下:

app.get('/task/:taskId/(?state=:status(pending|cancel|confirmed|deleted))?', routes.task.show); 

但我不知道爲什麼它不工作?

例如錯誤:無法獲取/任務/去到h ** p如果在51d2c53f329b8e0000000001://exampleapp.com/task/51d2c53f329b8e0000000001

+0

你能否詳細介紹一下你所看到的內容?我假設你實際上有兩條路線,一條用於你需要支持的每種情況。你能展示兩者嗎?他們中的一個是否工作? –

+0

上面設置路由器後,導航到http:// localhost:3000/task/51d2c53f329b8e0000000001時,出現錯誤無法獲取/任務/ 51d2c53f329b8e0000000001 由於兩個URL幾乎相同,所以我合併爲1路由 –

回答

1

按照Express API,你不能用繩子路線混合正則表達式的路線。

你應該做這樣的事情(我假設taskId爲整數):

app.get(/^\/task/([0-9]+)/(?state=:status(pending|cancel|confirmed|deleted))?, routes.task.show); 

不過,我不明白爲什麼當req.query.state在你的路線定義,你不能只檢查。這可能不太容易出錯並且更容易:

app.get("/task/:taskId", function(req, res, next) { 
    if (req.query.state) { 
    // Do things 
    } 

    next(); 
}); 
+1

修改代碼後通過使用查詢狀態,並按預期工作。謝謝 –

2

查詢字符串不能在路由中定義。您可以從req.query訪問查詢字符串參數。

app.get('/task/:taskId', function(req, res) { 
    if (req.query.state == 'pending') { ... } 
}); 

不過,如果你是修改任務,這是不恰當的方式來做到這一點。 GET請求應該是冪等的:請求不應該修改狀態。這就是POST的要求。

app.get('/task/:taskId', function(req, res) { 
    // show task info based on `req.params.taskId` 
}); 

app.post('/task/:taskId', function(req, res) { 
    // set task `req.params.taskId` to state `req.body.state` 
}); 

你既可以有一個<form>該職位的任務,或者讓一個Ajax請求:

$.post('/task/1', { state: 'pending' }, function() { ... }); 
+0

我通過使用put來更新我的代碼後,從url中獲取查詢字符串,現在它的作品。無論如何感謝您的幫助 –

0

你的問題是,查詢字符串沒有在路由考慮。您將不得不重新設計您的網址(即,將狀態包括到網址本身中,而不是查詢字符串中),或者在您的路由處理函數中檢查查詢字符串。