1

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

  1. 显示正常数据

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

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

两个网址都相同http://exampleapp.com/task/{{taskId}},只是与最后一个短语略有不同?state={{app.state}}

我使用 Express 路由如下:

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

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

例如错误:Cannot GET /task/51d2c53f329b8e0000000001 when going to h**p://exampleapp.com/task/51d2c53f329b8e0000000001

4

3 回答 3

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() { ... });
于 2013-07-02T16:16:33.037 回答
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();
});
于 2013-07-02T16:16:24.647 回答
0

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

于 2013-07-02T16:18:04.137 回答