Дополнительный параметр 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);
});