express-universal-query-validator
v1.0.1
Published
Express middleware to provide consistently parseable query parameters to universal applications
Downloads
197
Maintainers
Readme
express-universal-query-validator
Express middleware to provide consistently parseable query parameters to universal applications.
Introduction
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.
Usage
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`);
Configuration
[queryValidator
](API.md/# queryValidator) accepts a callback that is executed when invalid params are detected, and a configuration object.
See API.md for detailed documentation.
Examples
function invalidParamHandler(req, res, next, context) {
const { error, oldQuery, nextQuery, droppedParams } = context;
// Do what you love
}
app.use(queryValidator(invalidParamHandler));
Development
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.
Available tasks
Build and test
Runs all tests, static analysis, and bundle for distribution
$ npm start
Test
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
Docs
Regenerate API.md
docs from JSDoc comments
$ npm run docs