Я пытаюсь сделать так, чтобы один маршрут охватил все, /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*
который, конечно, не очень оптимален, так как он слишком много совпадет.
/foo*
подобные маршруты, разве вы не хотите вместо этого использовать промежуточное ПО?/foo*
совпадения,/foo/bar
но также совпадения,/foolish
которые вы, вероятно, не планировали.Ответы:
Думаю, у вас будет 2 маршрута. Если вы посмотрите на строку 331 маршрутизатора подключения, * в пути заменяется на. +, Поэтому будет соответствовать 1 или более символам.
https://github.com/senchalabs/connect/blob/master/lib/middleware/router.js
Если у вас есть 2 маршрута, которые выполняют одно и то же действие, вы можете сделать следующее, чтобы он оставался СУХИМ .
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);
источник
app.get(["/foo", "/foo*"], /* function */);
тоже может быть предпочтительным!Маршрутизатор подключения теперь удален ( https://github.com/senchalabs/connect/issues/262 ), автор заявляет, что для маршрутизации следует использовать фреймворк поверх подключения (например, Express).
В настоящее время Express обрабатывает
app.get("/foo*")
какapp.get(/\/foo(.*)/)
, что устраняет необходимость в двух отдельных маршрутах. Это контрастирует с предыдущим ответом (относящимся к теперь удаленному маршрутизатору подключения), в котором говорилось, что «*
в пути заменяется на.+
».Обновление: Express теперь использует модуль «path-to-regexp» (начиная с Express 4.0.0), который поддерживает такое же поведение в текущей версии. Мне неясно, сохраняет ли последняя версия этого модуля такое поведение, но пока этот ответ остается в силе.
источник
/\/foo(.+)/
если вы хотите сопоставить,/foo
за которым следует один или несколько символов,/foo*
или/\/foo(.*)/
если вы хотите сопоставить,/foo
за которым следует ноль или более символов.Вот полностью рабочий пример, не стесняйтесь копировать и вставлять его в файл .js для запуска с помощью node и играть с ним в браузере (или curl):
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: <br><br> <pre><a href="${test1}">${test1}</a></pre> <pre><a href="${test2}">${test2}</a></pre> <pre><a href="${test3}">${test3}</a></pre> <br><br> Will NOT match at: <pre><a href="${failTest}">${failTest}</a></pre> `)) app.listen(3000, () => console.log('Check this out in a browser at http://localhost:3000/hello/world!'))
источник
В массиве вы также можете использовать переменные, передаваемые в req.params:
app.get(["/:foo", "/:foo/:bar"], /* function */);
источник
Для тех, кто изучает node / express (как и я): по возможности не используйте маршрутизацию с подстановочными знаками!
Я также хотел реализовать маршрутизацию для GET / users /: id / something с использованием маршрутизации с использованием подстановочных знаков. Вот как я сюда попал.
Подробнее: https://blog.praveen.science/wildcard-routing-is-an-anti-pattern/
источник