Express middleware to provide consistently parseable query parameters to universal applications.
Normally, query parsing is handled by your server. For universal applications using something like react-router
, this can be a problem when a different path is taken to parse query strings on the client vs the server.
For example, a Node express server will parse a malformed query like ?key=foo%%
using the native Node.js querystring
module to { key: 'foo%%' }
. However, a client using decodeURIComponent
will throw an error like URIError: URI malformed
when encountering the same query.
This middleware solves this problem by validating each query parameter via decodeURIComponent
and providing a callback to take action on the server when invalid params are detected. The default behavior when no callback is provided is to log and then redirect to the same path with unparseable params removed.
This package is tested in both Node.js and browsers to ensure the same behavior in both runtimes.
import express from 'express';
import queryValidator from 'express-universal-query-validator';
const app = express();
// Mount the middleware
app.use(queryValidator());
// Other route handlers
// ...
app.listen(process.env.PORT);
console.info(`Server listening on ${process.env.PORT} and handling invalid query parameters`);
queryValidator
accepts a callback that is executed when invalid params are detected, and a configuration object.
See API.md for detailed documentation.
function invalidParamHandler(req, res, next, context) {
const { error, oldQuery, nextQuery, droppedParams } = context;
// Do what you love
}
app.use(queryValidator(invalidParamHandler));
In lieu of a formal style guide, please ensure PRs follow the conventions present, and have been properly linted and tested. Feel free to open issues to discuss.
Be aware this module is tested in both browser and node runtimes.
Runs all tests, static analysis, and bundle for distribution
$ npm start
Runs browser and node tests
$ npm test
Runs browser tests via PhantomJS only
$ npm run test:browser
Runs browser tests via SauceLabs only
$ SAUCELABS=true npm run test:browser
Runs node tests only
$ npm run test:node
Regenerate API.md docs from JSDoc comments
$ npm run docs