Skip to content

nporteschaikin/rackstring

Repository files navigation

rackstring

A drop-in replacement for Node's querystring module that parses query strings as Rack does, with support for nested objects and nested arrays.

Why?

There are a couple of popular alternatives to Node's querystring module, namely qs and query-string. Unfortunately:

  • query-string chooses not to support nested objects (objects in arrays).
  • qs does not parse objects nested in arrays quite yet; see ljharb/qs#215.

At Code Climate, we use Rack (vis-a-vis Rails) to handle web requests. Many of our client-to-server transactions rely on conforming query string formats, and neither alternative module supports parsing complex query strings in a Rack-compliant way. I explored forking qs and adding an option to support this sort of parsing, but adding this support proved to be non-trivial. Hence, rackstring was born.

Installation

npm install rackstring ---save

Usage

Parsing query strings

const querystring = require("rackstring")

const obj = querystring.parse("foo=bar")
assert.deepEqual(obj, { foo: "bar" })

As promised, rackstring supports parsing bracket-formatted arrays:

const obj = querystring.parse("foo[]=bar&foo[]=baz")
assert.deepEqual(obj, { foo: ["bar", "baz"] })

Additionally, rackstring parses complex arrays:

const obj = querystring.parse("foo[][a]=bar&foo[][b]=baz&foo[a]=meow&foo[b]=ruff")
assert.deepEqual(obj, { foo: [{ a: "bar", b: "baz"}, {a: "meow", b: "ruff"}] })

Stringifying objects

const str = querystring.stringify({ foo: [{ a: "bar", b: "baz"}, {a: "meow", b: "ruff"}] })
assert.equal(str, "foo[][a]=bar&foo[][b]=baz&foo[a]=meow&foo[b]=ruff")

Optionally, you can URL-encode keys with the encodeKeys option:

const str = querystring.stringify({ foo: [{ a: "bar", b: "baz"}, {a: "meow", b: "ruff"}] }, { encodeKeys: true })
assert.equal(str, "foo%5B%5D%5Ba%5D=bar&foo%5B%5D%5Bb%5D=baz&foo%5B%5D%5Ba%5D=meow&foo%5B%5D%5Bb%5D=ruff")

License

See LICENSE.

About

Rack's query string parser, ported to JavaScript

Resources

License

Stars

Watchers

Forks

Packages

No packages published