在 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 预挂钩中查询?

Node.js 手册查询-4-Express 方法

node.js查询express版本号

node.js用express怎么查询到MongoDB数据库列表

node.js 与 express 如何从 url 中删除查询字符串