Подтвердить что ты не робот

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*, который, конечно, не очень оптимален, так как он будет соответствовать многим.

4b9b3361

Ответ 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, Роберт