Hapi Query Filter
The purpose of this plugin is to convert query parameters into a single filter object that is accessible via request.query.filter
.
For example: ?first_name=John&last_name=Doe
would create a request.query
that looks like
{
filter: {
first_name: 'John',
last_name: 'Doe'
}
}
Registering the Plugin
const hapi = require('@hapi/hapi');
const server = new hapi.Server({});
await server.register([
{
plugin: require('hapi-query-filter'),
options: {
ignoredKeys: ['count', 'offset'], // Array of query parameters not to convert to filter object
defaultEnabled: true // if true plugin will be used on all routes
}
}
]);
Ignoring Keys
You can ignore keys to have them stay at the root level of request.query
. A configuration of:
const hapi = require('@hapi/hapi');
const server = new hapi.Server({});
await server.register([
{
plugin: require('hapi-query-filter'),
options: {
ignoredKeys: ['count', 'offset'], // Array of query parameters not to convert to filter object
defaultEnabled: true // if true plugin will be used on all routes
}
}
]);
Will cause a request like ?first_name=John&last_name=Doe&count=10&offset=0
to create a request.query
that looks like:
{
count: 10,
offset: 0,
filter: {
first_name: 'John',
last_name: 'Doe'
}
}
Enabling at the Route Level
If defaultEnabled: false
you will need to enable the plugin an a per-route basis by doing the following:
const hapi = require('@hapi/hapi');
const server = new hapi.Server({});
await server.register([require('hapi-query-filter')]);
server.route({
method: 'GET',
path: '/test',
config: {
handler: async (request) => { ... },
plugins: {
queryFilter: {
enabled: true,
ignoredKey: ['count', 'offset'], // Array will be concatenated with the ignoredKeys set at register
params: ['test_param'] // Array of request.params that will be put into filter object
}
}
}
})