在节点JS中使用Express进行查询string的预路由

我试图用express来parsing查询string,以防某些参数被设置,并在实际路由发生之前执行一小段代码。 用例是获取一个可以设置的特定值,而不依赖于正在使用的链接。 我使用快递'function,通过使用next()传递给下一个可能的规则的东西。

到目前为止,我试过了 – 在所有的app.get / post-rule-block的顶部:

app.get('[?&]something=([^&#]*)', function(req, res, next) { var somethingID = req.params.something; // Below line is just there to illustrate that it's working. Actual code will do something real, of course. console.log("Something: "+somethingID); next(); }) app.get('/', site.index); 

并且:

 app.param('something', function(req, res, next) { var somethingID = req.params.something; console.log("Something: "+somethingID); next(); }) app.get('/', site.index); 

应该触发什么的例子:

 URL: www.example.com/?something=10239 URL: www.example.com/superpage/?something=10239 URL: www.example.com/minisite/?anything=10&something=10239 

不幸的是,我的解决scheme实际上没有任何工作,而所有发生的事情是,下一个匹配的规则被触发,但上面的小函数从来没有执行。 任何人有一个想法,如何做到这一点?

编辑:我明白,参数示例不工作,因为我没有使用任何其他路由规则之后的所述参数,它只会被触发。

我也明白,逻辑意味着,Express忽略查询string,它通常在路由已经发生之后在函数内被parsing。 但是,如前所述,我需要这是“路线不可知的”,并与任何在这个应用程序中处理的URL一起工作。

express不允许你基于查询string进行路由。 如果相关参数存在,可以添加一些执行某些操作的中间件;

 app.use(function (req, res, next) { if (req.query.something) { // Do something; call next() when done. } else { next(); } }); app.get('/someroute', function (req, res, next) { // Assume your query params have been processed }); 

好的,这里有一个相当合理的缺陷。 路由只使用URL,并忽略查询string。

(或更好的“A”)解决scheme实际上是这样的:

 app.get('*', function(req, res, next) { if (req.query.something) { console.log("Something: "+req.query.something); }; next(); }) 

说明:由于Express忽略路由的查询string,唯一匹配所有URL的正则expression式是“*”。 一旦触发,我可以检查是否存在查询string,执行我的逻辑,并通过使用“next()”继续匹配下一个规则的路由。

是的: facepalm