Экспресс-js подстановочная маршрутизация, чтобы охватить все, включая путь - PullRequest
79 голосов
/ 28 мая 2011

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

Ответы [ 5 ]

99 голосов
/ 28 мая 2011

Я думаю, вам нужно будет 2 маршрута.Если вы посмотрите на строку 331 подключенного маршрутизатора, то * в пути заменяется на. +, Поэтому будет соответствовать 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);
30 голосов
/ 09 сентября 2013

Маршрутизатор соединения теперь удален (https://github.com/senchalabs/connect/issues/262), автор заявляет, что для маршрутизации следует использовать платформу поверх соединения (например, Express).

Express в настоящее время обрабатывает app.get("/foo*") как app.get(/\/foo(.*)/), что устраняет необходимость в двух отдельных маршрутах. Это противоречит предыдущему ответу (касающемуся теперь удаленного подключенного маршрутизатора), в котором говорилось, что "* в пути заменено на .+ ".

Обновление: В Express теперь используется модуль" path-to-regexp "(начиная с Express 4.0.0), который поддерживает такое же поведение в версиив настоящее время ссылаются. Мне неясно, сохраняет ли поведение последняя версия этого модуля, но на данный момент этот ответ остается.

8 голосов
/ 06 октября 2016

В массиве вы также можете использовать переменные, передавая в req.params:

app.get(["/:foo", "/:foo/:bar"], /* function */);
3 голосов
/ 17 августа 2018

Нет необходимости иметь два маршрута.

Просто добавьте (/*)? в конце вашей строки path.

Например, app.get('/hello/world(/*)?' /* ... */)

Вот полностью рабочий пример, не стесняйтесь скопировать и вставить его в файл .js для работы с узломи поиграйте с ним в браузере (или завитке):

const app = require('express')()

// will be able to match all of the following
const test1 = 'http://localhost:3000/hello/world'
const test2 = 'http://localhost:3000/hello/world/'
const test3 = 'http://localhost:3000/hello/world/with/more/stuff'

// but fail at this one
const failTest = 'http://localhost:3000/foo/world'

app.get('/hello/world(/*)?', (req, res) => res.send(`
    This will match at example endpoints: 

${test1}
<a href="${test2}">${test2}</a>
<a href="${test3}">${test3}</a>


НЕ будет совпадать с:
<a href="${failTest}">${failTest}</a>
`)) app.listen (3000, ()=> console.log ('Проверьте это в браузере на http://localhost:3000/hello/world!'))
2 голосов
/ 03 декабря 2016

Для тех, кто изучает узел / экспресс (точно так же, как я): не используйте маршрутизацию с подстановочными символами, если это возможно!

Я также хотел реализовать маршрутизацию для GET / users /: id / что угодно с использованием подстановочной маршрутизации,Вот как я сюда попал.

К счастью, я также нашел эту статью: http://www.jongleberry.com/wildcard-routing-is-an-anti-pattern.html

Приветствия, Роберт

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...