我正在尝试使用express来解析查询字符串,以防设置某些参数并在实际路由发生之前执行一小段代码。用例是获取一个可以设置的特定值,与所使用的链接无关。我使用express'功能使用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
不幸的是,我的解决方案都没有真正起作用,而且所有发生的事情都是,下一个匹配规则被触发,但上面的小功能永远不会被执行。有人知道如何做到这一点吗?
编辑:我明白,param-example不能正常工作,因为之后我没有在任何其他路由规则中使用所述参数,只会被触发。
我也明白,这个逻辑暗示,Express忽略了查询字符串,并且在路由已经发生之后,它在函数内正常解析。但如上所述,我需要将其视为“与路由无关”,并使用此应用程序中处理的任何URL。
答案 0 :(得分:21)
express
不允许您根据查询字符串进行路由。如果存在相关参数,您可以添加一些执行某些操作的中间件;
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
});
答案 1 :(得分:1)
好的,这里有一个非常合乎逻辑的缺陷。路由仅使用URL,并忽略查询字符串。
(或更好的“A”)解决方案实际上是这样的:
app.get('*', function(req, res, next) {
if (req.query.something) {
console.log("Something: "+req.query.something);
};
next();
})
说明:由于Express忽略了路由的查询字符串,因此匹配所有URL的唯一正则表达式是“*”。一旦触发,我可以检查所述查询字符串是否存在,执行我的逻辑并使用“next()”继续匹配下一个规则的路由。
是的: facepalm