дублирующиеся параметры получают массив от node.js express или vue роутера - PullRequest
2 голосов
/ 28 мая 2020

У меня большая проблема.

Во всех других проектах, которые я делал, я использовал apache или Nginx и PHP. Если у меня есть URL-адрес / test? Param = 1¶m = 2, значение $ _REUEST ['param'] равно 2.

Но в Node.js (Express) я получаю массив [ 1,2]

Я мог бы использовать new URLSearchParams(this.$route.fullPath), а затем метод .get() или .getAll(), чтобы получить только одно значение. Но у нас есть большой проект и много циклов и применений this. $ Route.query в нескольких файлах.

Можно ли отфильтровать this. $ Route.query в одном месте? Или express может изменить возвращение этих параметров, например apache / nginx?

Ответы [ 2 ]

0 голосов
/ 29 мая 2020
app.use((req, res, next) => {
      if (req.query) {
        const oldQuery = JSON.stringify(req.query);
        const queryStrings = [];
        Object.keys(req.query).forEach((paramKey) => {
          if (Array.isArray(req.query[paramKey])) {
            const paramArray = req.query[paramKey];
            req.query[paramKey] = paramArray[paramArray.length - 1]; // always return the last provided value
            queryStrings.push(`${paramKey}=${req.query[paramKey]}`);
          }
        });
        const newQuery = JSON.stringify(req.query);
        if (oldQuery !== newQuery) {
          res.redirect(301, `${req.path}?${queryStrings.join('&')}`);
        }
      }
      next();
    });

Это работает путем перенаправления. Не идеальная вещь, которую я хочу, но с тем же результатом

0 голосов
/ 28 мая 2020

Это действительно проблема, поскольку базовый парсер express работает таким образом . В качестве обходного пути вы можете написать небольшой помощник для извлечения желаемого значения в случае, если параметр запроса является массивом. Что-то вроде:

function getQueryParam(req, queryParam) {
    if (!req.query) {
        return undefined;
    }
    if (Array.isArray(req.query[queryParam])) {
        const paramArray = req.query[queryParam];
        return paramArray[paramArray.length - 1]; // always return the last provided value
    }
    return req.query[queryParam];
}

Вы можете использовать это так:

app.get('/', (req, res) => {
    const paramValue = getQueryParam(req, "param");
    // do something with paramValue 
});
...