Дополнительный параметр GET в экспресс-маршруте
Следующее:
app.get('/foo/start/:start/end/:end', blah.someFunc);
совпадения
/foo/start/1/end/4
но я хочу, чтобы он также соответствовал необязательному параметру
/foo/start/1/end/4/optional/7
Я пробовал это:
app.get('/foo/start/:start/end/:end(/optional/:value)?', blah.someFunc);
но он не соответствует ни одному из двух приведенных выше примеров. Я думаю, потому что я пытаюсь дать ему RegExp
, когда он ожидает чего-то еще?
Спасибо.
Ответы
Ответ 1
Почему бы вам не добавить еще одно правило до того, которое у вас есть, например
app.get('/foo/start/:start/end/:end/optional/:value', blah.someFunc);
app.get('/foo/start/:start/end/:end', blah.someFunc);
Он будет использоваться до версии без дополнительного значения.
Если вы хотите использовать только одну строку, попробуйте это:
app.get('/foo/start/:start/end/:end/optional?', blah.someFunc)
см. документы для примера.
Ответ 2
Если вы используете Express 4.x, то я думаю, что лучше использовать формат массива для маршрута.
Например, у меня есть маршрут /service
, который дает весь список услуг и тот же маршрут, когда используется с id /service/id/:id
, дает единую услугу с идентификатором в параметре.
app.get(['/service', '/service/id/:id'], function(req, res) {});
Ответ 3
Вы также можете использовать регулярные выражения в маршрутах. Возможно, что-то вроде:
app.get(/^\/foo\/start\/:start\/end\/:end(\/optional\/:value)?/, function (req, res, next) {
Ответ 4
В этом примере, если URL-адрес/hello или /hello/world, он работает.? делает параметр необязательным (выражение 4).
// app.js
var index = require('/routes/index');
app.use('/hello', index);
// routes/index.js
router.get('hello/:name?', function(req, res){
var name = req.params.name;
var data = {
name: name
};
res.json(data);
});