Json-server: About X-Total-Count

Created on 28 Apr 2015  路  6Comments  路  Source: typicode/json-server

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: .... }

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.

All 6 comments

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,
    })
  }
}
Was this page helpful?
0 / 5 - 0 ratings

Related issues

AdamCook44 picture AdamCook44  路  3Comments

0plus1 picture 0plus1  路  3Comments

goldmont picture goldmont  路  3Comments

pantchox picture pantchox  路  3Comments

boydenhartog picture boydenhartog  路  3Comments