Точное сопоставление маршрута со строками запроса в express

#node.js #express

#node.js #экспресс

Вопрос:

У меня есть один маршрут, /addresses который возвращает все адреса пользователя.

Мне нужно создать другой API, который принимает фильтры latitude и longitude .

Любой может передать этот фильтр по тому же маршруту, /addresses?lat=23.23amp;lng=-70.22 что и .

В этом случае я должен изменить свой предыдущий метод контроллера, чтобы проверить наличие фильтров.

Возможно ли это в express?Я мог бы создать другой маршрут с точным совпадением со строками запроса.

Как это делается с параметрами запроса /addresses/:addressId .

Поэтому для этого он попадет в другой контроллер:

 /addresses    AddressController.getAllAddresses()
/addresses?lat=:latamp;lng=:lng   AddressController.getAddressByLatLngFilter()
 

Ответ №1:

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

 app.get('/addresses', geo.addresses )
 

И определите обработчики маршрута таким образом, чтобы можно было перенести на другой:

 var this_module = module.exports =  {

 "addresses":  function(req, res, next) {
    if (req.query.lat amp;amp; req.query.lng) {
      return this_module.addresses_by_loc(req,res,next);
    }
    // handle one way...
  },

 "addresses_by_loc": function(req, res, next) {
    // handle another
  }
}
 

Комментарии:

1. Спасибо, выглядит лучшим подходом, но все же, возможно ли то, что я упомянул выше?

2. @Magnetaar Я не думаю, что есть способ сделать это, используя шаблоны экспресс-маршрутов, поскольку часть перед ? определяет маршрут, а часть после — параметры запроса. Тем не менее, это просто синтаксический сахар, выражаете ли вы условную маршрутизацию либо в сопоставлении шаблонов маршрутизатора Express, либо явно в вашем собственном коде. Тем не менее, SO полно сообщений, в которых принятый ответ гласит: «X невозможно», а более поздний ответ показывает, что это так.