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

干杯,罗伯特