Working with Query Strings
1. Parsing Query Strings (querystring.parse)
Example
import qs from "node:querystring";
qs.parse("a=1&b=2&a=3"); // { a: ["1","3"], b: "2" }
Note: The querystring module is LEGACY. Prefer URLSearchParams.
2. Stringifying Objects (querystring.stringify)
| Call | Output |
qs.stringify({a:1,b:2}) | a=1&b=2 |
qs.stringify(o, ";", ":") | Custom separators |
3. Encoding Values (querystring.escape)
| API | Equivalent |
qs.escape | encodeURIComponent |
4. Decoding Values (querystring.unescape)
| API | Equivalent |
qs.unescape | decodeURIComponent |
5. Handling Arrays in Query Strings
| Convention | Example |
| Repeated key | tag=a&tag=b |
| Bracket notation | tag[]=a&tag[]=b (qs library) |
| Comma-separated | tag=a,b |
6. Using Custom Separators (& vs ;)
Example
qs.parse("a=1;b=2", ";"); // { a: "1", b: "2" }
7. URLSearchParams vs querystring
| Feature | URLSearchParams | querystring |
| Standard | WHATWG | Node-only |
| Repeated keys | Multiple entries | Coerced to array |
| Iteration | Iterable | Plain object |
| Recommended | ✅ | Legacy |
8. Building Query Strings from Objects
Example
const sp = new URLSearchParams(Object.entries({ q: "node", page: 2 }));
console.log(sp.toString()); // q=node&page=2
9. Handling Nested Objects
| Tool | Reason |
qs npm package | Encodes nested objects as a[b]=1 |
| Native APIs | Don't support nesting |
10. Using qs Package for Complex Queries
Example
import qs from "qs";
qs.stringify({ filter: { status: "active", age: { gt: 18 } } });
// filter[status]=active&filter[age][gt]=18
| Option | Use |
arrayFormat: "brackets" | a[]=1&a[]=2 |
arrayFormat: "comma" | a=1,2 |
encode: false | Skip URI encoding |