在 Node JS 中使用 Express 的查询字符串进行预路由
Posted
技术标签:
【中文标题】在 Node JS 中使用 Express 的查询字符串进行预路由【英文标题】:Pre-routing with querystrings with Express in Node JS 【发布时间】:2013-02-01 07:11:19 【问题描述】:我正在尝试使用 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。
【问题讨论】:
【参考方案1】: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
);
【讨论】:
这比我自己的解决方案更优雅有效。非常感谢。【参考方案2】:好吧,这里有一个相当大的逻辑缺陷。路由只使用 URL,而忽略查询字符串。
(或更好的“A”)解决方案实际上是这样的:
app.get('*', function(req, res, next)
if (req.query.something)
console.log("Something: "+req.query.something);
;
next();
)
解释:由于 Express 忽略了路由的查询字符串,唯一匹配所有 URL 的正则表达式是“*”。一旦触发,我可以检查所述查询字符串是否存在,执行我的逻辑并使用“next()”继续匹配下一条规则的路由。
是的:facepalm
【讨论】:
以上是关于在 Node JS 中使用 Express 的查询字符串进行预路由的主要内容,如果未能解决你的问题,请参考以下文章
如何从 Node.js / Express 应用程序的 Mongoose 预挂钩中查询?
如何从 Node.js / Express 应用程序的 Mongoose 预挂钩中查询?