Egyik előző posztomban a Query String-ek fogalmáról írtam, pont azért, hogy ebben a cikkben már ne kelljen külön kitérni rá. Így most itt bemutatok néhány lehetséges módot a Query String-ek elkapására Node.JS alatt.
Node - QueryString Legacy Módszer
const http = require("http");
const querystring = require("node:querystring");
http.createServer(main).listen(8080, () => console.log("Server started..."));
function main(req, res) {
res.setHeader("Content-Type", "application/json");
const parsedURL = JSON.stringify(
querystring.parse(req.url.split("?")[1]),
null,
"\t"
);
res.write(parsedURL);
res.end();
}
A req.url-el megkapjuk a protokolt, a domainnevet, a path-ot és a query stringet is. A split-el ezt ketté szedjük, így egy tömböt kapunk. A tömb első eleme a protokol, a domainnév, a path. A második maga a query string.
A const querystring = require("node:querystring"); -t használva, annak parse metódusának a req.url-ből levágott query srting-eket átadjuk, a JSON.sstringify-nek átadva majd azt egy parsedUSL változóba téve a res write metódusával kiírathatjuk.
DEMO
https://9yqk0e.sse.codesandbox.io/?parameter1=1¶meter2=2¶meterA=A¶meterB=B¶meter1=1.1
Json válasz:
// A https://9yqk0e.sse.codesandbox.io/ válasza
{
"parameter1": [
"1",
"1.1"
],
"parameter2": "2",
"parameterA": "A",
"parameterB": "B"
}
A query-string NPM csomag használata
A csomagot telepíteni kell globálisan, vagy a projekthez, az npmjs-en leírtak szerint.
const http = require("http");
const queryString = require("query-string");
http.createServer(main).listen(8080, () => console.log("Server started..."));
function main(req, res) {
res.setHeader("Content-Type", "application/json");
const parsedURL = JSON.stringify(
queryString.parse(req.url.split("?")[1]),
null,
"\t"
);
res.write(parsedURL);
res.end();
}
Itt szintén a le-splittelt query string-ket kell átadni a parse metódusnak, majd az előzőkhez hasonlóan JSON.stringify, majd a kapott változót a response write metódusába tesszük.
DEMO
https://sik8g4.sse.codesandbox.io/?a=1&b=2&c=3&a=4&c=5&a=6&a=7&b=8
JSON válasz:
// A https://sik8g4.sse.codesandbox.io válasza
{
"a": [
"1",
"4",
"6",
"7"
],
"b": [
"2",
"8"
],
"c": [
"3",
"5"
]
}
URLSearchParams-t használva minden hozzáadott csomag nélkül
const http = require("http");
http.createServer(main).listen(3000, () => console.log("Server started..."));
function main(req, res) {
const paramstring = req.url.split("?")[1];
const params = new URLSearchParams(paramstring);
const response = {};
params.forEach(function (value, key) {
if (response[key] !== undefined) {
if (typeof response[key] === "string") {
const oldkey = response[key];
response[key] = [oldkey, value];
} else {
response[key].push(value);
}
} else {
response[key] = value;
}
});
console.log(response);
res.setHeader("Content-Type", "application/json");
res.write(JSON.stringify(response, null, "\t"));
res.end();
}
Szintén a levágott query string splittet átadva a URLSearchParams egy új példányának egy objektumot kapunk a query sringjeinkből, amit a fenti példában a params változóba tette.
A params-on forEach-al kell végigmenni, hogy egy új objektumba helyezve az egyforma query string kulcsokból értékként tömböt kapjunk. Ezt egy if statement vezérli.
A fenti és a lenti JSON kimeneti példán is látható, hogy az egyszer használt paraméter kulcsoknak string-ek a sz értékei, amíg a többször használtaknak tömbök.
DEMO: https://21g8dn.sse.codesandbox.io/?a=1&a=2&b=3&c=4&c=5&a=6
JSON válsz
// A https://21g8dn.sse.codesandbox.io válasza
{
"a": [
"1",
"2",
"6"
],
"b": "3",
"c": [
"4",
"5"
]
}
Ezeket a stringeket elkapva a query-stringek definíciójáról készült postomban bemutatott lehetőségek szerint lehet alkalmazni.