Есть ли способ сделать это на одном вызове функции?
var todo = function (req, res){};
app.get("/", todo);
app.get("/blabla", todo);
app.get("/blablablabla", todo);
Что-то вроде:
app.get("/", "/blabla", "/blablablabla", todo );
Я знаю, что это синтаксический беспорядок, но просто для того, чтобы дать представление о том, чего бы я хотел достичь, массив маршрутов был бы потрясающим!
Кто-нибудь знает, как это сделать?
Ответ 1
Я столкнулся с этим вопросом, ища ту же функциональность.
@Jonathan Ong упоминает в комментарии выше, что использование массивов для путей устарело, но оно явно описано в Express 4, и оно работает в Express 3.x. Вот пример чего-то попробовать:
app.get(
['/test', '/alternative', '/barcus*', '/farcus/:farcus/', '/hoop(|la|lapoo|lul)/poo'],
function ( request, response ) {
}
);
Изнутри объекта request
с указанием пути /hooplul/poo?bandle=froo&bandle=pee&bof=blarg
:
"route": {
"keys": [
{
"optional": false,
"name": "farcus"
}
],
"callbacks": [
null
],
"params": [
null,
null,
"lul"
],
"regexp": {},
"path": [
"/test",
"/alternative",
"/barcus*",
"/farcus/:farcus/",
"/hoop(|la|lapoo|lul)/poo"
],
"method": "get"
},
Обратите внимание, что происходит с параметрами: он знает группы захвата и параметры во всех возможных путях, независимо от того, используются они или нет в текущем запросе.
Таким образом, стекирование нескольких путей через массив может быть сделано легко, но побочные эффекты, возможно, непредсказуемы, если вы надеетесь получить что-нибудь полезное из пути, который использовался в качестве параметров или групп захвата. Это, вероятно, более полезно для избыточности/сглаживания, и в этом случае он будет работать очень хорошо.
Изменить: см. также @c24w answer ниже.
Изменить 2: Это умеренно популярный ответ. Имейте в виду, что ExpressJS, как и большинство библиотек Node.js, является подвижным праздником. Хотя вышеописанная маршрутизация все еще работает (я использую ее в настоящий момент, очень удобная функция), я не могу ручаться за вывод объекта запроса (это, безусловно, отличается от того, что я описал). Пожалуйста, тщательно протестируйте, чтобы убедиться, что вы получите желаемые результаты.
Ответ 2
app.get('/:var(bla|blabla)?', todo)
:var
устанавливает req.param
, который вы не используете. он используется только в этом случае для установки регулярного выражения.
(bla|blabla)
устанавливает соответствие регулярному выражению, поэтому оно соответствует строкам bla
и blablah
.
?
делает все регулярное выражение необязательным, поэтому оно также соответствует /
.
Ответ 3
Фактически вы можете передать массив путей, как вы упомянули, и он отлично работает:
var a = ['/', '/blabla', '/blablablabla'];
app.get(a, todo);
Ответ 4
Чтобы подробно описать ответ Кевина, это из 4.x docs:
Путь, для которого вызывается функция промежуточного программного обеспечения; может быть любым из:
- Строка, представляющая путь.
- Шаблон пути.
- Регулярный шаблон выражения для соответствия путям.
- Массив комбинаций любого из приведенных выше.
У них есть examples, в том числе:
Это будет соответствовать путям, начинающимся с /abcd
, /xyza
, /lmn
и /pqr
:
app.use(['/abcd', '/xyza', /\/lmn|\/pqr/], function (req, res, next) {
next();
});
Ответ 5
Я пошел за:
['path', 'altPath'].forEach(function(path) {
app.get(path, function(req, res) { etc. });
});
Ответ 6
требуется файл исходного маршрута и определить новый маршрут, подобный этому
var user = require('./users');
router.post('/login', user.post('/login'));