将数组传递给 app.get() 的第一个参数的替代品是什么?

What's the replacement for passing an array to the first argument of app.get()?

提问人:Madara's Ghost 提问时间:2/12/2015 更新时间:12/12/2015 访问量:224

问:

在过去,你可以做这样的事情:

app.get(['/', '/dashboard'], (req, res, next) => { ... });

以便使用相同的路由处理程序拥有多个路由。

一些 Stack Overflow 答案表明此行为已弃用,不应再使用。

除了丑陋的正则表达式或半黑客(例如将函数放入变量并将其传递给 2 个不同的调用)之外,还有没有一种优雅的替代方案,而不是仅将数组作为第一个参数传递?app.get()

JavaScript 节点 .js Express

评论

0赞 Shan Robertson 2/12/2015
为什么你认为用 2 个 .get 调用传递给它一个函数是半黑客?
0赞 Madara's Ghost 2/12/2015
因为传递一个字符串数组,你想在两个字符串上应用相同的操作,这在节点上是一种约定。我认为这是一个半黑客,出于同样的原因,我不必在返回变量之前缓存变量中的值。它无缘无故地增加了冗长。
0赞 Shan Robertson 2/12/2015
啊,有趣..只是好奇,因为我也想知道这一点,并尝试了很多方法。这是我发现的最干净的处理方式。我做了 2 次调用,因为索引返回为并且不会被调用拾取。是的,我知道这就是你说的,你不想做的。router.get('/', getRoute); router.get('/:page', getRoute);//:page
0赞 adeneo 2/12/2015
我假设您创建了两个路由,它们调用相同的函数
2赞 rlemon 2/12/2015
我认为这个问题的答案是:您(以及我)提到的两种方法之一不如数组解决方案优雅。@express-devs 把我的数组还给我!</ranty-comment>

答:

1赞 chapinkapa 3/5/2015 #1

执行以下操作:

var express = require('express');
var app = express();
var originalExpressGet = app.get;

app.get = (function() {
  var expressApp = app;
  function turnToArray(args){
    var array = [];
    for(var i = 0; i < args.length; i++){
      array.push(args[i]);
    }
    return array;
  }
  return function(routes, callback) {
    var args = turnToArray(arguments);
    if(args.length <= 1){
      return originalExpressGet.apply(app, arguments);
    }

    if(!Array.isArray(routes)){
      routes = [routes];
    }
    args.shift();
    routes.forEach(function(route){
      originalExpressGet.apply(app, [route].concat(args));
    });
  }
  return app;
}());

这样一来,您仍然使用 express 的 app.get,但它允许您将 [] 用于多个路由。例如,这适用于:

app.get(['/', '/same'], function(req, res){
  res.send(true);
});

这也是这样做的:

app.get('/another route', function(req, res){
  res.send(true);
});