Express-js通配符路由来覆盖包含path的所有内容
我试图让一条路线覆盖/foo
包括/foo
本身。 我已经尝试使用/foo*
, 除了不匹配/foo
外 ,其他都适用。 注意:
var express = require("express"), app = express.createServer(); app.get("/foo*", function(req, res, next){ res.write("Foo*\n"); next(); }); app.get("/foo", function(req, res){ res.end("Foo\n"); }); app.get("/foo/bar", function(req, res){ res.end("Foo Bar\n"); }); app.listen(3000);
输出:
$ curl localhost:3000/foo Foo $ curl localhost:3000/foo/bar Foo* Foo Bar
我有什么select? 我提出的最好的方法是路由/fo*
哪一个当然是不是最佳的,因为它会匹配很多。
我想你将不得不有2条路线。 如果您查看连接路由器的第331行,则path中的*会replace为。+,因此会匹配1个或多个字符。
https://github.com/senchalabs/connect/blob/master/lib/middleware/router.js
如果您有两条执行相同操作的路线,则可以执行以下操作以保持干燥。
var express = require("express"), app = express.createServer(); function fooRoute(req, res, next) { res.end("Foo Route\n"); } app.get("/foo*", fooRoute); app.get("/foo", fooRoute); app.listen(3000);
连接路由器现在已经被删除( https://github.com/senchalabs/connect/issues/262 ),作者声明你应该使用连接(如Express)的路由之上的框架。
Express 目前将 app.get("/foo*")
视为app.get(/\/foo(.*)/)
,不再需要两个单独的路由。 这与之前的回答(指现在移除的连接路由器)相反,后者声明“ *
在path中被replace为.+
”。
更新: Express现在使用“path-to-regexp”模块(自Express 4.0.0以来),它在当前引用的版本中保持相同的行为 。 目前还不清楚该模块的最新版本是否保持行为,但现在这个答案是站得住脚的。
在数组中,你也可以使用传递给req.params的variables:
app.get(["/:foo", "/:foo/:bar"], /* function */);
对于那些正在学习node / express的人(就像我一样):如果可能的话,不要使用通配符路由!
我也想实现使用通配符路由GET / users /:id / whatever的路由。 我就是这样来的
幸运的是,我也发现这篇文章: http : //www.jongleberry.com/wildcard-routing-is-an-anti-pattern.html
干杯,罗伯特