#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
, должно удовлетворять вашим требованиям.
Добавлен код в соответствии с запросом 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, если один не аутентифицирован, а другой нет