2016-06-24 6 views
1
app.get('/api/advancedSearch/:id/:page_no/:exact_phrase?/:exclude_words?' 
,function (req,res) 
{ //body }); 

Я пытаюсь создать app.get, как показано выше, у меня нет никаких проблем с первой парой полей, проблема возникает с «exact_phrase» и «исключить слова "поля. Они должны быть списками, и если оба они пройдены, у меня нет проблем с их получением.выразить app.get с несколькими полями

Что вызывает проблемы в том, что иногда одно или оба из этих полей могут отсутствовать, и мне все еще нужно его получить. Кажется, я не могу создать для этого приложение app.get.

Есть ли способ создать приложение app.get или отправить запрос, чтобы я мог это сделать?

+3

Похоже, вам лучше использовать ['req.query'] (http://expressjs.com/en/4x/api.html#req.query) вместо' req.params' – cdbajorin

ответ

3

В общем случае необязательные части URL-адреса работают намного лучше в строке запроса, поскольку они сами идентифицируют, какие из них присутствуют (поскольку они являются именованными параметрами, а не только идентифицированы по позиции URL).

Сегменты URL-адреса в экспресс-поиске маршрута заданы по заказу, и у вас не может быть какой-либо последовательности необязательных параметров, потому что это просто не детерминировано для того, что было передано. Сам алгоритм сопоставления маршрутов Express не столь гибкий и мощный, как вам кажется.

У вас есть несколько вариантов:

  1. Оставьте :exact_phrase и :exclude_words из определения маршрута, а затем просто сделать свой собственный URL разбор в обработчик маршрута, чтобы увидеть именно то, что есть. Таким образом, вы можете настроить любой желаемый формат.

  2. Укажите все параметры, которые могут быть в другом порядке или могут быть необязательными в качестве параметров запроса, а не сегменты пути в 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 не может сделать это для вас автоматически.

+0

Ровно что я искал благодаря! –