Express 快速路由:指向同一路由的多个URL

Express 快速路由:指向同一路由的多个URL,express,routes,Express,Routes,我正在尝试使多个URL在一条快速路线上工作。如何使以下URL全部路由到同一页面 看起来这应该行得通,但事实并非如此: router.get("/:slug?(/amp)?", function(req, res, next) { if (!req.params.slug) { req.params.slug = 'home' } getData(slug, function(err, data){ res.render('index', data) });

我正在尝试使多个URL在一条快速路线上工作。如何使以下URL全部路由到同一页面

看起来这应该行得通,但事实并非如此:

router.get("/:slug?(/amp)?", function(req, res, next) {

  if (!req.params.slug) {
    req.params.slug = 'home'
  }

  getData(slug, function(err, data){

    res.render('index', data)

  });

});

您可以为路由指定一个名称并将该名称传递给router.get,而不是使用匿名函数作为路由的控制器。然后可以有多个指向同一函数的router.get

function slugController(req, res, next) {

  if (!req.params.slug) {
    req.params.slug = 'home'
  }

  getData(slug, function(err, data){

    res.render('index', data)

  });

});

router.get("/page-slug-name", slugController);
router.get("/page-slug-name/amp", slugController);
router.get("/", slugController);
router.get("/amp", slugController);
如果只有几条路线,这种方法效果最好


如果你有大量的路线,你就必须使用本文中提到的正则表达式。不过,我在您的URL中看不到任何模式,因此使用regex很难找到一个好的解决方案。

您可以给它起个名字,然后将名字传递给router.get,而不是使用匿名函数作为路由的控制器。然后可以有多个指向同一函数的router.get

function slugController(req, res, next) {

  if (!req.params.slug) {
    req.params.slug = 'home'
  }

  getData(slug, function(err, data){

    res.render('index', data)

  });

});

router.get("/page-slug-name", slugController);
router.get("/page-slug-name/amp", slugController);
router.get("/", slugController);
router.get("/amp", slugController);
如果只有几条路线,这种方法效果最好


如果你有大量的路线,你就必须使用本文中提到的正则表达式。不过,我看不到您的URL中有任何模式,因此使用正则表达式很难找到一个好的解决方案。

您可以通过将多个URL放置在一个数组中,在单个快速路由中使用它。 在你的情况下,这将是

  app.get(['/', '/:slug', '/amp', '/:slug/amp'], function(req, res, next) {
    if (!req.params.slug)
      req.params.slug = 'home'
    getData(slug, function(err, data){
      res.render('index', data)
    });
  );

通过在一个数组中放置多个URL,您可以在单个express路由中使用它。 在你的情况下,这将是

  app.get(['/', '/:slug', '/amp', '/:slug/amp'], function(req, res, next) {
    if (!req.params.slug)
      req.params.slug = 'home'
    getData(slug, function(err, data){
      res.render('index', data)
    });
  );

成功了。我不得不重新安排我的路线,使/an/amp排在slug路线之前。谢谢你的帮助:成功了。我不得不重新安排我的路线,使/an/amp排在slug路线之前。感谢您的帮助: