Разбор URL в node.js

Я разрабатываю restAPI, используя Node.js. В этом ниже приведен URL-адрес моего API:

http://xxxxxxxx:3000/map70/places?node[level0=12&level1=34&level2=234][ids=1,2,3,4][key=xxxxxxxxxx][val=2011]

В этом я должен получить каждый уровень level0, level1, level2, ids, key, value.

В обычном формате url, как показано ниже:

http://xxxxxxxx:3000/map70/places?key=xxxxxxx&val=2011&level0=2&level1=33&level2=602

Я могу анализировать, как req.query.level0.. Но для вышеуказанного URL-адреса, как я могу его разобрать. Я много искал, но я не могу найти правильное решение. Помогите мне решить это. Спасибо заранее.

1 ответ

Есть ли имя для этого стиля параметра запроса? Я никогда не слышал об этом. Если вокруг есть какой-то стандарт, вы можете найти какой-то неясный модуль, который будет разбирать его. В противном случае очень вероятно, что вам придется самостоятельно разбирать строку.

Вы можете получить вещь с помощью модуля url узла:

var url = require('url');
var parsed = url.parse('http://xxxxxxxx:3000/map70/places?node[level0=12&level1=34&level2=234][ids=1,2,3,4][key=xxxxxxxxxx][val=2011]');
var query = parsed.query;

На данный момент query теперь содержит node[level0=12&level1=34&level2=234][ids=1,2,3,4][key=xxxxxxxxxx][val=2011], и вы можете начать раздвигать его с помощью строковых операций,

[Обновить]

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

var querystring = require('querystring');
var q2 = query.slice(5, -1);
// q2 == "level0=12&level1=34&level2=234][ids=1,2,3,4][key=xxxxxxxxxx][val=2011"
var q3 = q2.replace(/\]\[/g, '&');
// q3 == "level0=12&level1=34&level2=234&ids=1,2,3,4&key=xxxxxxxxxx&val=2011"
querystring.parse(q3);
// returns:
// { level0: '12',
// level1: '34',
// level2: '234',
// ids: '1,2,3,4',
// key: 'xxxxxxxxxx',
// val: '2011' }

Вы можете объединить все это в:

querystring.parse(query.slice(5, -1).replace(/\]\[/g, '&'));

licensed under cc by-sa 3.0 with attribution.