Middleware allowing the client to filter the response to only what they need,
reducing the amount of traffic over the wire using the ?filter=foo,bar,baz querystring parameter.
JSONSelect would also be great for this but I find it's a little too complicated for the average use-case, so this is just a simple key filter.
$ npm install @koa/json-filter
Please note that if you're using an earlier version of koa 2 with function generator you need to install the older version 0.0.1
$ npm install koa-json-filter@0.0.1
namequerystring param defaulting to "filter"
You may also set ctx.filter to an array of names to filter on,
for example by using a header field X-Filter: name,email.
Script:
constKoa=require('koa');constfilter=require('@koa/json-filter');constapp=newKoa();app.use(filter());app.use(asyncctx=>{ctx.body={name: 'tobi',email: 'tobi@segment.io',packages: 5,friends: ['abby','loki','jane']};});app.listen(3000);console.log('app listening on port 3000');Response:
$ GET /?filter=name
{
"name": "tobi"
}
Script:
constKoa=require('koa');constfilter=require('@koa/json-filter');constapp=newKoa();app.use(filter());app.use(asyncctx=>{ctx.body=[{name: 'tobi',email: 'tobi@segment.io',packages: 5,friends: ['abby','loki','jane']},{name: 'loki',email: 'loki@segment.io',packages: 2,friends: ['loki','jane']},{name: 'jane',email: 'jane@segment.io',packages: 2,friends: []},{name: 'ewald',email: 'ewald@segment.io',packages: 2,friends: ['tobi']}];});app.listen(3000);console.log('app listening on port 3000');Response:
$ GET /?filter=name,email
[
{
"name": "tobi",
"email": "tobi@segment.io"
},
{
"name": "loki",
"email": "loki@segment.io"
},
{
"name": "jane",
"email": "jane@segment.io"
},
{
"name": "ewald",
"email": "ewald@segment.io"
}
]
MIT