Express.js路由与可选参数?

我有两种情况从数据库中获取数据

  1. 显示正常的数据

    http://exampleapp.com/task/{{taskId}} 
  2. 通过发布来编辑数据

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

这两个url有相同的http://exampleapp.com/task/{{taskId}}只是有点不同于最后一个短语?state={{app.state}}

我使用Express路由如下:

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

但是我不知道为什么它不起作用?

例如错误:无法GET /任务/ 51d2c53f329b8e0000000001何时去h ** p://exampleapp.com/task/51d2c53f329b8e0000000001

查询string不能在路由中定义。 您可以从req.query访问查询string参数。

 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() { ... }); 

根据Express API ,您不能将RegExp路由与string路由混合使用。

你应该这样做(我假设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(); }); 

你的问题是,查询string不考虑路由。 您将不得不重新devise您的url(即,将状态包括到url本身,而不是查询string中),或者在您的路由处理函数中检查查询string。