我有两种情况从DB
获取数据显示正常数据
http://exampleapp.com/task/{{taskId}}
通过发布来编辑数据
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);
但我不知道为什么它不起作用?
例如错误:转到h ** p://exampleapp.com/task/51d2c53f329b8e0000000001
时无法GET / task / 51d2c53f329b8e0000000001答案 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)
您的问题是路由中不考虑查询字符串。您将不得不重新设计您的网址(即,将状态包含在网址本身而不是查询字符串中)或检查路由处理程序函数中的查询字符串。