express & mongoose - Cannot call method 'get' of undefined - using res.json()

and thanks to be there.

Issue : I'm making a tiny mongoose "middleware" to handle a mongoose error :

// callback function called at each mongoDB response
var handleDbRes = function(callback) {
    return function (err, entries) {
        if (err) {
            err.status = 500;
            return next(err);
        }

        return callback(entries)  // that line throw the exception
    }
};

And so I'm using it into an api endpoint, e.g. :

someRouter.get('/', function(req, res) {
    models.article.find(handleDbRes(res.json))
})

With that code, I encounter an error :

TypeError: Cannot call method 'get' of undefined

I followed the exception and looked at res.json() declaration, when debugging, I figured out :

var app = this.app;
var *** = app.get('***') // that line throw the exception

I guess that app is not defined cause app doesn't exists in "this".

Please can you help me to solve this problem ? I think that the reason is simple but I don't get it...

Thanks you for listening ;)

EDIT : I tried to res.json.bind(res) and it worked, as I thought, but that's really awful to bind this way for most api endpoint and I guess there is another way to do that kind of functionality without that.

EDIT : Thanks to Mscdex advices, I modified my code this way :

.get('/', function(req, res, next) {
            models.article.find(handleDbRes(res.json.bind(res), next))

...
...
// callback function called at each mongoDB response
var handleDbRes = function(successCallback, errorCallback) {
    return function (err, entries) {
        if (err) {
            err.status = 500;
            return errorCallback(err);
        }

        return successCallback(entries)
    }
};

When you pass res.json, the context for the json() function is lost (it no longer knows what this is because it is not bound). So here are a few possible solutions:

Use a bound version of the function so that this inside json() will always evaluate correctly:

someRouter.get('/', function(req, res) {
  models.article.find(handleDbRes(res.json.bind(res)))
})

Or use a wrapper function instead:

someRouter.get('/', function(req, res) {
  function respondJSON(val) {
    res.json(val);
  }
  models.article.find(handleDbRes(respondJSON))
})

Or just pass in res and call res.json() inside handleDbRes():

someRouter.get('/', function(req, res) {
  models.article.find(handleDbRes(res))
})

// callback function called at each mongoDB response
var handleDbRes = function(res) {
  return function(err, entries) {
    if (err) {
      err.status = 500;
      return next(err);
    }

    res.json(entries);
  }
};

The other problem is that handleDbRes() doesn't have access to next, so you need to also pass that function in for when you run into an error.