Как настроить маршрут с несколькими вариантами выбора в приложении Express?

#node.js #express #routes

#node.js #выражать #маршруты

Вопрос:

Я определил маршрут в своем экспресс-приложении как таковой :

 app.get('/ts/:space/:mode/:param1/:param2/:fromdate/:todate',(req,res,next) =>{...})
 

Но теперь я хотел бы добавить дополнительные параметры, если :space параметр равен определенному значению. Например, если :space is blah , то маршрут должен преобразоваться в

 app.get('/ts/:space/:mode/:param1/:param2/:param3/:fromdate/:todate',(req,res,next) =>{...})
 

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

Ответ №1:

Добавление дополнительного параметра отображает его как новый отдельный маршрут, поэтому я думаю, что перенаправление на этот новый маршрут всякий раз, когда вы сталкиваетесь :space = blah , должно удовлетворять вашим требованиям.

res.redirect()

Добавлен код в соответствии с запросом OP

 app.get('/ts/:space/:mode/:param1/:param2/:fromdate/:todate', (req, res, next) => {
  let param3 = 'sample';
  if (req.params.space === 'blaah') {
    res.redirect(`/ts/${req.params.space}/${req.params.mode}/${req.params.param1}/${req.params.param2}/${param3}/${req.params.fromdate}/${req.params.todate}`);
  }
});
 

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

1. Спасибо за ваш ответ. Как бы вы использовали его именно в моем случае, пожалуйста? Я еще не знаком с этим.

2. @Chapo Надеюсь, это было то, что вы искали. Я также добавил код.

3. Спасибо. Хотя я не знаю param3 заранее. Есть ли способ получить его из маршрута?

4. Но param3 также отсутствует в первом маршруте

5. Да, в этом весь смысл 🙂 Я бы хотел, чтобы приложение знало, что нужно переключиться на маршрут, который включает param3, если параметр пробела имеет определенное значение

Ответ №2:

Разделите свои функции обработчика, чтобы изолировать функции.

 app.get('/ts/:space/:mode/:param1/:param2/:fromdate/:todate', handler1)

app.get('/ts/:space/:mode/:param1/:param2/:param3/:fromdate/:todate', handler2)
 

и трюк с handler1 особым случаем:

 const handler1 = (req,res,next) => {
  if (req.params.space === "blah") {
    // use hanler for `/ts/:space/:mode/:param1/:param2/:param3/:fromdate/:todate` route
    // force set param3 value,
    req.params['param3'] = "maybe_a_default_value";
    return handler2(req,res,next);
  }
  // handler for `/ts/:space/:mode/:param1/:param2/:fromdate/:todate` route
}

const handler2 = (req,res,next) => {
  // handler for `/ts/:space/:mode/:param1/:param2/:param3/:fromdate/:todate`
  // now, req.params.space === "blah" and req.params.param3 === "maybe_a_default_value" 
}
 

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

1. Спасибо за ваш ответ. Мой обработчик тот же. В обработчике я проверяю space , а затем делаю разные вещи, предполагая, что остальные параметры существуют (так param3 в случае space = blah ). Будет ли ваше решение req.params.param3 получено в моем обработчике или мое предназначение param3 будет просто fromdate ?

2. ооо, просто установите param3 значение в вашем handler1 , я обновил свой ответ.

3. хорошо, спасибо. Не думаю, что это работает для моего варианта использования, потому что я не знаю param3 заранее. Мне нужно handler2 выбрать его из пути. Возможно ли это?

4. Вы можете выбрать param3 handler2 другие параметры пути ( req.params просто объект). …. В handler1 вы можете установить param3 для следующего обработчика, все может быть установлено на param3 , req.params['param3'] = req.params['fromdate'] — Это то, что вы хотите?

5. Если вам нужно выбрать его из пути, вы можете либо использовать его как 2 разных API и вызвать один и тот же обработчик для 2 API, либо определить этот дополнительный параметр в качестве параметра запроса для API. Если это один и тот же обработчик, нет смысла иметь 2 разных API, если один не аутентифицирован, а другой нет