Как обрабатывать нулевые параметры URL с помощью Express. js - PullRequest
1 голос
/ 04 марта 2020

Я работаю над заданием для своего класса веб-сервисов и не могу понять, как обрабатывать нулевой параметр URL. Вот мой код:

    app.get('/nachos/:x/:cheese/:tomatoes/:salsa/:hotsauce', (req, res) => {
        var x = parseInt(req.params['x'])
        var cheese = (req.params['cheese'])
        var tomatoes = (req.params['tomatoes'])
        var salsa = (req.params['salsa'])
        var hotsauce = (req.params['hotsauce'])

        res.send('You ordered ' + x + ' nacho(s) with ' + cheese + ', ' + tomatoes + ', ' + salsa + ', ' 
        + hotsauce + '.')})

Этот код отлично работает со всеми заполненными параметрами. Но как мне обработать нулевой параметр, если я не хочу, например, сальсы и ввести URL-адрес localhost:port/nachos/1/cheese/tomatoes/hotsauce

Ответы [ 3 ]

1 голос
/ 04 марта 2020

Если я правильно читаю, вопрос:

Как мне обработать параметр null, если я не хочу, например, сальса и тип в URL localhost:port/nachos/1/cheese/tomatoes/hotsauce

Вы не получите null, он просто не будет соответствовать маршруту.

Вы можете сделать параметры необязательными, например:

app.get('/nachos/:x?/:cheese?/:tomatoes?/:salsa?/:hotsauce?', (req, res) => {

или добавьте маршруты для соответствия, которые могут выйти из-под контроля.

app.get([
    //...
    '/nachos/:x/:cheese/:tomatoes',
    '/nachos/:x/:cheese/:tomatoes/:hotsauce',
    '/nachos/:x/:cheese/:tomatoes/:salsa/:hotsauce',
    //...
], (req, res) => {
1 голос
/ 04 марта 2020

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

/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.

0 голосов
/ 04 марта 2020

Передача параметров таким способом запрашивает у пользователя API отправку параметров в правильном порядке. Чтобы обработать случай, который вы хотите (отсутствующий ингредиент), вам нужно будет создать другой маршрут для обработки. Но вы можете сделать это другим способом, например, передать параметры в виде строк запроса или даже отправить их в теле запроса (предпочтительно для маршрутизаторов без GET).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...