В общем случае необязательные части URL-адреса работают намного лучше в строке запроса, поскольку они сами идентифицируют, какие из них присутствуют (поскольку они являются именованными параметрами, а не только идентифицированы по позиции URL).
Сегменты URL-адреса в экспресс-поиске маршрута заданы по заказу, и у вас не может быть какой-либо последовательности необязательных параметров, потому что это просто не детерминировано для того, что было передано. Сам алгоритм сопоставления маршрутов Express не столь гибкий и мощный, как вам кажется.
У вас есть несколько вариантов:
Оставьте :exact_phrase
и :exclude_words
из определения маршрута, а затем просто сделать свой собственный URL разбор в обработчик маршрута, чтобы увидеть именно то, что есть. Таким образом, вы можете настроить любой желаемый формат.
Укажите все параметры, которые могут быть в другом порядке или могут быть необязательными в качестве параметров запроса, а не сегменты пути в URL-адресе, а затем используйте req.query
, чтобы увидеть, что именно было в URL-адресе. Параметры запроса являются необязательными и могут быть в любом порядке.
Этот последний вариант будет выглядеть так:
// url: /api/advancedSearch/123/4?exact_phrase=foo&exclude_words=cat,dog
app.get('/api/advancedSearch/:id/:page_no/', function(req,res) {
var excludeWords = [];
if (req.query.exclude_words) {
excludeWords = req.query.exclude_words.split(",");
}
var exactPhrase = req.query.exact_phrase || "";
// do the rest of your processing here
});
FYI, имеет смысл концептуально, что необязательные аргументы должны быть в QueryString, а не в основной URL пути. Поскольку параметры строки запроса самоопределяются, это делает его намного менее двусмысленным, какие из них присутствуют, а какие нет. Если у вас есть дополнительные сегменты пути в URL-адресе, вам нужно каким-то образом изобрести какую-то систему для определения того, какой сегмент пути присутствует и каково его значение. Поскольку это полностью приложение и контекст, Express не может сделать это для вас автоматически.
Похоже, вам лучше использовать ['req.query'] (http://expressjs.com/en/4x/api.html#req.query) вместо' req.params' – cdbajorin