Express.js路由与可选参数?

时间:2013-07-02 15:55:46

标签: node.js express

我有两种情况从DB

获取数据
  1. 显示正常数据

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

    http://exampleapp.com/task/{{taskId}}/?state={{app.state}}
    
  3. 两个网址与上一个短语http://exampleapp.com/task/{{taskId}}只有一点点不同?state={{app.state}}

    我使用Express路由如下:

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

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

    例如错误:转到h ** p://exampleapp.com/task/51d2c53f329b8e0000000001

    时无法GET / task / 51d2c53f329b8e0000000001

3 个答案:

答案 0 :(得分: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() { ... });

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

您的问题是路由中不考虑查询字符串。您将不得不重新设计您的网址(即,将状态包含在网址本身而不是查询字符串中)或检查路由处理程序函数中的查询字符串。