是否可以使用快速路线正则表达式中的捕获组?

时间:2019-06-06 09:52:51

标签: javascript node.js regex express

我正在使用GOV.UK原型套件开发相当大的节点/表达应用程序。为了存档目的,我将原型的多个实例分离为独立版本,例如这不是一次“干”的构建,而是随着原型的发展(有时是很大的)有很多重复。至关重要的是每个版本例如/ phase / release /已适当分隔。

我已经很好地分离了路由,但最后一个有用的方法是拥有动态route.use-> require,这样我就不必为每个路由手动更新顶级route.js文件版本发布。

我在路由中经常使用正则表达式匹配,因此我对此非常熟悉,但是我想知道的是如何使用匹配的详细信息动态构建需求。或者也许在req.params中使用某些内容-但我认为这不在路线之外。

这是我的代码的概述。静态路由(R1)可以正常工作,但动态路由(R2 / R3)都不起作用(未注释时):

const express = require('express')
const router = express.Router()

router.use('/:phase/:release', function (req, res, next) {

  // Make phase and release available in subsequent routes
  let prototype = {}
  prototype.phase = req.params.phase
  prototype.release = req.params.release
  req.session.data.prototype = prototype

  next()

})

// Phase/release specific routes
// -----------------------------

// R1. This works
router.use('/test/a/', require('./views/test/a/_routes.js'));

// R2. But a dynamic version world be better?...
// router.use(/(alpha|beta|test)\/([abc])\//, require('./views/' + \1 + '/' + \2 '/_routes.js'));
// R3. ...or...
// router.use('/:phase/:release/', require('./views/' + req.params.phase + '/' + req.params.release '/_routes.js'));

最终,我认为我的方法是错误的,并且不可能以这种方式引用正则表达式捕获组,但是同样,我认为我无法访问req对象(因此也无法访问req.params)作为require路径的一部分。

我希望在构造的需求路径中提出需求之前,有一种使用已知信息的方法,但我只是想不出办法。

非常感谢任何输入/帮助。

2 个答案:

答案 0 :(得分:1)

希望我能正确理解您的问题。

如果_routes.js导出了一个路由器,该路由器本质上是接受 req,res,next 参数的功能,那么您可以执行以下操作:

router.use('/:phase/:release/', function(req, res, next){

    var anotherRouter = require('./views/' + req.params.phase + '/' + req.params.release '/_routes.js');
    anotherRouter(req, res, next);

});

答案 1 :(得分:0)

Express documentation for router.get在最后一个示例中说明,当您使用正则表达式作为route参数时,按位置在req.params中可以使用捕获的组(在Express 4.17上进行了测试)。当然,这也适用于必需的路由器处理程序,而不是功能(如您所愿)。

router.use(/(alpha|beta|test)\/([abc])\//, (req, res) => {
  console(req.params[0]); // will show the first captured group: alpha, beta or test
  console(req.params[1]); // will show the 2nd captured group
});