Express-js подстановочный знак для покрытия всех объектов и включая путь
Я пытаюсь, чтобы один маршрут охватывал все под /foo
, включая /foo
. Я пробовал использовать /foo*
, который работает для всего, кроме того, что он не соответствует /foo
. Обратите внимание:
var express = require("express"),
app = express.createServer();
app.get("/foo*", function(req, res, next){
res.write("Foo*\n");
next();
});
app.get("/foo", function(req, res){
res.end("Foo\n");
});
app.get("/foo/bar", function(req, res){
res.end("Foo Bar\n");
});
app.listen(3000);
Выходы:
$ curl localhost:3000/foo
Foo
$ curl localhost:3000/foo/bar
Foo*
Foo Bar
Каковы мои варианты? Лучшее, что я придумал, - это маршрут /fo*
, который, конечно, не очень оптимален, так как он будет соответствовать многим.
Ответы
Ответ 1
Думаю, вам нужно будет 2 маршрута. Если вы посмотрите на строку 331 маршрутизатора подключения, то * в пути будет заменен на. + So будет соответствовать 1 или более символам.
https://github.com/senchalabs/connect/blob/master/lib/middleware/router.js
Если у вас есть 2 маршрута, которые выполняют одно и то же действие, вы можете сделать следующее, чтобы оно было DRY.
var express = require("express"),
app = express.createServer();
function fooRoute(req, res, next) {
res.end("Foo Route\n");
}
app.get("/foo*", fooRoute);
app.get("/foo", fooRoute);
app.listen(3000);
Ответ 2
Теперь маршрутизатор подключения удален (https://github.com/senchalabs/connect/issues/262), автор заявляет, что вы должны использовать фреймворк поверх соединения (например, Express) для маршрутизации.
Экспресс в настоящее время рассматривает app.get("/foo*")
как app.get(/\/foo(.*)/)
, устраняя необходимость в двух отдельных маршрутах. Это контрастирует с предыдущим ответом (см. Теперь удаленный маршрутизатор соединения), в котором указано, что "*
в пути заменяется на .+
".
Обновление: Экспресс теперь использует модуль "путь к регулярному выражению" (начиная с версии 4.0.0), который поддерживает то же поведение в текущей версии. Мне непонятно, сохраняет ли последняя версия этого модуля поведение, но на данный момент этот ответ стоит.
Ответ 3
В массиве вы также можете использовать переменные, переходящие в req.params:
app.get(["/:foo", "/:foo/:bar"], /* function */);
Ответ 4
Для тех, кто изучает node/express (как и я): не используйте подстановочную маршрутизацию, если это возможно!
Я также хотел реализовать маршрутизацию для GET/users/: id/whatever, используя групповую маршрутизацию. Вот как я сюда попал.
К счастью, я также нашел эту статью: http://www.jongleberry.com/wildcard-routing-is-an-anti-pattern.html
Cheers,
Роберт