May we provide information in X-Total-Count like JSON parameter?
In my case: I use ExtJS for build my application. Currently I have problem with getting information from response header.
In my opinion: We can make json-server response like
{ count: .... , data: .... }
There's many way to return a slice of an array, and you're right that's a valid way to do.
There was also a discussion about pagination here: https://github.com/typicode/json-server/issues/57
For the moment, I prefer to return an array and meta in headers. But maybe a mock server implementing JSON API would work better with ExtJS (never used this lib)... can't remember right now other mock server names, but there is fortunejs.
Sorry about that.
Hi @typicode
we can enable this (a count property in the body response) via a flag?
Several (request) solution doesn't provide a way to access to header data.
Is there any solution to do that?
I found a solution by creating server.js :
Const jsonServer = require('json-server')
.....
....
....
router.render = function(req, res) {
Var newData = {
TotalCount: res.get('X-Total-Count'),
Result: res.locals.data
}
res.json(newData)
}
With your solution, you'll not have the "total count", but the number of returned items.
I found a solution using lowdb. It's not perfect because we need to call the db twice (one for the initial request, one for the total count).
For example, I want to count the number of users.
const db = await low(myStorage);
const countItems = resource =>
db
.get(resource)
.map('id')
.value().length;
router.render = (req, res) => {
res.jsonp({
items: res.locals.data.items,
totalItems: countItems('users') // parse url to get the desired resource
});
};
I found a solution by creating server.js :
Const jsonServer = require('json-server')
.....
....
....router.render = function(req, res) {
Var newData = {
TotalCount: res.get('X-Total-Count'),
Result: res.locals.data
}
res.json(newData)
}
@lowdev, Thank you, This should be the accepted answer.
I was searching for how to get X-Total-Count from render, your answer inspired me. Here is some slightly formatted code.
router.render = (req, res) => {
// if it's a GET request and result is an Array
if (req.method === 'GET' && Array.isArray(res.locals.data)) {
res.json({
total: res.get('X-Total-Count'),
list: res.locals.data,
})
}
}
Most helpful comment
Hi @typicode
we can enable this (a count property in the body response) via a flag?
Several (request) solution doesn't provide a way to access to header data.