2014-09-28 4 views
0

и благодаря тому, что он есть.express & mongoose - Невозможно вызвать метод «получить» неопределенного - используя res.json()

Выпуск: Я делаю маленькую мангуста «промежуточное программное обеспечение» для обработки ошибки мангуста:

// 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 
    } 
}; 

И поэтому я использую его в апи конечную точку, например, :

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

С этим кодом, возникает ошибка:

TypeError: Cannot call method 'get' of undefined

Я последовал за исключение и посмотрел на res.json() заявление, при отладке, я разобрался:

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

Я предполагаю, что приложение не определено, потому что приложение «нет» не существует.

Пожалуйста, помогите мне решить эту проблему? Я думаю, что причина проста, но я не понимаю ...

Спасибо за внимание;)

EDIT: Я пытался res.json.bind(res), и она работала, как я думал, но это на самом деле ужасно, чтобы связать этот путь для большинства API конечных точек, и я думаю, что есть другой способ сделать такую ​​функциональность без этого.

EDIT: Благодаря MSCDEX советы, я изменил свой код так:

.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) 
    } 
}; 

ответ

0

Когда вы передаете res.json, контекст для функции json() теряется (она уже не знает, что this это потому, что он не связан). Так вот несколько возможных решений:

Используйте связанную версию функции, так что this внутри json() всегда будет правильно оценить:

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

Или используйте функцию обертку вместо:

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

Или просто перейдите в res и позвоните по телефону res.json() внутри 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); 
    } 
}; 

Другая проблема заключается в том, что handleDbRes() не имеет доступа к next, поэтому вам также необходимо передать эту функцию, когда вы столкнулись с ошибкой.

+0

Спасибо за подробный ответ, Я отредактировал мое сообщение о решении проблемы. ;) – Kaari

Смежные вопросы