Express.js路由与可选参数?
我有两种情况从数据库中获取数据
-
显示正常的数据
http://exampleapp.com/task/{{taskId}}
-
通过发布来编辑数据
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。