Вы действительно не делаете необязательные аргументы в определении маршрута, которое выглядит следующим образом:
/nachos/:x/:cheese/:tomatoes/:salsa/:hotsauce
, потому что для соответствия маршрута должен присутствовать каждый из параметров, а для req.params
чтобы содержать правильный вариант, все они должны быть в правильном порядке. Если это варианты, некоторые из которых являются необязательными, то сопоставление их с тем, как вы были, - это просто неправильный дизайн URL, и сопоставление с изменяющимся URL-адресом, подобным этому в Express, будет немного трудным.
Самый простой способ, который я могу придумать, это просто поместить необязательные ингредиенты в строку запроса, как показано ниже:
/nachos/2?cheese=yes&tomatoes=yes&salsa=yes&hotsauce=yes
Затем вы просто сопоставляете маршрут: /nachos/:x
в качестве единственной необходимой опции для URL и все остальное может быть необязательно указано в строке запроса, и вы можете написать свой код так, чтобы он по умолчанию имел значение «нет», если опция отсутствует. Таким образом, заказ без горячего соуса может быть одним из следующих:
/nachos/2?cheese=yes&tomatoes=yes&salsa=yes&hotsauce=no
/nachos/2?cheese=yes&tomatoes=yes&salsa=yes
Заказ без горячего соуса или сальсы может быть следующим:
/nachos/2?cheese=yes&tomatoes=yes
Тогда ваш обработчик запросов будет выглядеть так :
const orderOptions = ["cheese", "tomatoes", "salsa", "hotsauce"];
app.get('/nachos/:x', (req, res) => {
console.log(req.query);
let text = orderOptions.map(item => {
return req.query[item] === "yes" ? item : null;
}).filter(item => !!item).join(", ");
res.send(`You ordered ${req.params.x} nacho(s) with ${text}.`);
});
Я должен упомянуть, что если этот запрос фактически указывает порядок, то он, вероятно, должен быть POST, а не GET, и параметры должны быть в теле POST, и они будет принимать ту же форму, что и строка запроса, вероятно, закодированная так же, как application/x-www-form-urlencoded
из формы POST.