Как определить сложные маршруты с именованными параметрами в express.js?

Я хочу настроить несколько более сложных маршрутов, которые могут включать в себя ряд необязательных параметров. Предпочтительно, я хотел бы использовать именованные параметры для удобства доступа. Вот пример того, чего я пытаюсь достичь:

// The following routes should be matched based on parameters provided:
// GET /books/:category/:author
// GET /books/:category/:author/limit/:limit
// GET /books/:category/:author/skip/:skip
// GET /books/:category/:author/limit/:limit/skip/:skip
// GET /books/:category/:author/sort/:sortby
// GET /books/:category/:author/sort/:sortby/limit/:limit
// GET /books/:category/:author/sort/:sortby/skip/:skip
// GET /books/:category/:author/sort/:sortby/limit/:limit/skip/:skip
app.get('/books/:category/:author/(sort/:sortby)?/(limit/:limit)?/(skip/:skip)?', myController.index);

Как вы можете видеть, я пытаюсь сгруппировать необязательные параметры с помощью (paramKey/paramValue)?. Таким образом, я надеялся, что смогу "смешивать и сопоставлять" необязательные параметры, все еще используя имена параметров. К сожалению, это не работает.

Есть ли способ получить эту работу без необходимости писать прямые регулярные выражения и добавлять дополнительную логику для анализа любых результирующих групп параметров на основе индексов?

В принципе, я ищу простой способ проанализировать пары ключ/значение с маршрута.

Ответ 1

Похоже, вы хотите повторно реализовать строку запроса с использованием пути URL. Я предполагаю, что если вы действительно этого хотели, да, вам придется написать свою собственную логику синтаксического анализа. Параметры экспресс-маршрута AFAIK являются позиционными, а строка запроса - нет. Просто используйте строку запроса, и выражение автоматически проанализирует ее для вас.

/books?category=sports&author=jack&limit=15?sortby=title

Это позволит вам сделать

req.query.sortby

Вы можете получить выражение, чтобы выполнить 1/2 разбора для вас с помощью регулярного пути выражения, такого как (:key/:value)* или что-то вдоль этих строк (которое будет соответствовать нескольким парам ключ/значение), но выражение не является и затем проанализируем эти результаты для вас.

Ответ 2

вы можете отправить данные для просмотра следующим образом:

//in the server side ...
 app.get('/search/:qkey/:qvalue', function(req, res){
    res.write(JSON.stringify({
      qkey:req.params.qkey;
      qvalue:req.params.qvalue;
    }));
 });

и на стороне клиента... вызов ajax

$.ajax({
  type:"POST",
  url:"/search/"+qkey+"/"+qvalue,
  success: function(data){
    var string = eval("(" + data + ")");
    //you access to server response with
    console.log(string.qkey+" and "+ string.qvalue);
  }
});