Мне нужно создать url для get, который будет принимать массив, как в node.js/express извлечь массив из запроса?

Мне нужно создать url для get, который будет принимать массив, как в node.js/express извлечь массив из запроса? Мне нужно передать массив с именами, какие параметры мне нужно вернуть из Person

model.

/api/person # here I need to pass which fields I want to see but to be generic.

Ответ 1

Один параметр использует формат JSON.

http://server/url?array=["foo","bar"]

Серверная сторона

var arr = JSON.parse(req.query.array);

Или ваш собственный формат

http://server/url?array=foo,bar

Серверная сторона

var arr = req.query.array.split(',');

Ответ 2

Вы можете кодировать массив в процентном кодировании, просто "перезаписывая" поле, формально конкатенируя значения.

app.get('/test', function(req,res){
    console.log(req.query.array);
    res.send(200);
});




localhost:3000/test?array=a&array=b&array=c

Этот запрос напечатает ['a','b','c'].

Ответ 3

Экспресс предоставляет параметр запроса в качестве массива, когда он повторяется более одного раза в URL-адресе запроса:

app.get('/', function(req, res, next) {
   console.log(req.query.a)
   res.send(200)
}

GET /?a=x&a=y&a=2:
// query.a is ['x', 'y', 'z']

То же самое относится к req.body в других методах.

Ответ 4

Используя следующий код:

app.use('/', (req, res) => {
    console.log(req.query, typeof req.query.foo, Array.isArray(req.query.foo));
    res.send('done');
});

В бэкэнд у вас есть два стандартных подхода. Для следующих запросов:

  • /Foo = 1 &? Foo = 2
  • /Foo [] = 1 &? Foo [] = 2

ваш сервер NodeJS получит следующий объект запроса:

  • {foo: ['1', '2']} 'object' true
  • {foo: ['1', '2']} 'object' true

Итак, вы можете выбрать способ, которым хотите. Моя рекомендация вторая, почему? Если вы ожидаете массив, и вы просто передаете одно значение, то вариант один будет интерпретировать его как регулярное значение (строка) и не содержать массив.

[Я сказал, что у нас есть два стандарта и не в порядке, нет стандарта для массивов в URL-адресах, это два общих способа существования. Каждый веб-сервер делает это по-своему, как Apache, JBoss, Nginx и т.д.]

Ответ 5

Если вы хотите передать массив из параметров url, вам нужно выполнить следующий пример:

Пример URL:

https://website.com/example?myarray[]=136129&myarray[]=137794&myarray[]=137792

Чтобы получить его из выражения:

console.log(req.query.myarray)
[ '136129', '137794', '137792' ]

Ответ 6

У экспресс есть инструмент, чтобы проверить, будет ли ваш путь соответствовать маршруту, который вы создаете: Экспресс-тестер Express.js.

Как говорит Хосе Мато, вам нужно решить, как структурировать ваш URL:

  • Foo = 1 &? Foo = 2
  • Foo [] = 1 &? Foo [] = 2

HTTP-запрос должен выглядеть так, если вы выбрали метод 1:

http://baseurl/api/?foo=1&foo=2

Ваш маршрут должен иметь следующую логику:

app.get('/api/:person', (req, res) => {
    /*This will create an object that you can iterate over.*/
    for (let foo of req.params.foo) {
      /*Do some logic here*/
    }
});

Ответ 7

Вы можете передавать элементы массива, разделенные косой чертой - GET/api/person/foo/bar/...

Определите свой маршрут как '/api/person/(:arr)*'

req.params.arr будет иметь первый параметр. req.params[0] будет остальным как строка. Вы разбиваете и создаете массив с этими двумя.

app.get('/api/person/(:arr)*', function(req, res) {
        var params = [req.params.arr].concat(req.params[0].split('/').slice(1));
        ...
});

GET /api/person/foo
params = ["foo"]

GET /api/person/foo/bar
params = ["foo", "bar"]

...

Ответ 8

Здесь используйте это, "% 2C" - это символ кодировки HTML для запятой.

jsonToQueryString: function (data) {
   return Object.keys(data).map((key) => {
        if (Array.isArray(data[key])) {
            return encodeURIComponent('${key}=${data[key].map((item) => item).join('%2C')}');
        }
        return encodeURIComponent('${key}=${data[key]}');
    }).join('&');
}

Для доступа к параметрам запроса

const names = decodeURIComponent(req.query.query_param_name);
const resultSplit = names.split(',');