Мне нужно создать 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(',');