快递路线参数条件
Posted
技术标签:
【中文标题】快递路线参数条件【英文标题】:Express routes parameter conditions 【发布时间】:2012-06-30 18:54:22 【问题描述】:我的 Express 应用上有一条如下所示的路线:
app.get('/:id', function (request, response)
…
);
ID 始终是一个数字。但是,目前这条路线正在匹配其他东西,例如/login
。
我想我想从中得到两件事:
-
仅当 ID 为数字时才使用此路由,并且
仅当没有为该特定参数定义路由时(例如与
/login
冲突)。
这个可以吗?
【问题讨论】:
【参考方案1】:是的,请查看 http://expressjs.com/guide/routing.html 和 https://www.npmjs.com/package/path-to-regexp(快递使用)。一个可能工作的未经测试的版本是:
app.get(/^(\d+)$/, function (request, response)
var id = request.params[0];
...
);
【讨论】:
【参考方案2】:扩展 Marius 的答案,您可以提供正则表达式和参数名称:
app.get('/:id(\\d+)/', function (req, res)
// req.params.id is now defined here for you
);
【讨论】:
很好,但现在如果我有一条路线可以在其他地方使用/1
,它仍然会调用它。无论如何要防止这种情况发生?
只要明确的/1
路由首先添加,它将优先。
您可以先放置显式路由,正如 JohnnyHK 所说。您还可以将 RegEx 定义为不匹配您要跳过的路线。
按优先级排序您的路由处理程序,然后使用function(req, res, next)
,当您的逻辑知道它需要将控制权传递给行中的下一个路由处理程序时,从任何路由中调用 next()。跨度>
如果您使用像 Mongo ObjectID 这样的字母数字 id,您将需要更改正则表达式【参考方案3】:
你可以使用:
// /12345
app.get(/\/([^\/]+)\/?/, function(req, res)
var id = req.params[0];
// do something
);
或者这个:
// /post/12345
app.get(/\/post\/([^\/]+)\/?/, function(req, res)
var id = req.params[0];
// do something
);
【讨论】:
以上是关于快递路线参数条件的主要内容,如果未能解决你的问题,请参考以下文章