2014-09-28 66 views
0

並感謝在那裏。express&mongoose - 不能調用未定義的方法'get' - 使用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 
    } 
}; 

所以我使用它變成一個API端點,例如:

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 

我想這個應用程序沒有定義,因爲應用程序不存在於「this」中。

請你能幫我解決這個問題嗎?我認爲,原因很簡單,但我不明白這一點...

感謝您的收聽;)

編輯:我試圖res.json.bind(res)和它的工作,因爲我以爲,但這是真的可怕的是爲大多數API端點綁定這種方式,我想還有另一種方法來做這種功能沒有。

編輯:由於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是因爲它沒有綁定)。因此,這裏有幾個可能的解決方案:

使用功能的結合版本,以便thisjson()總是正確的評價:

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 2014-09-28 20:31:10

相關問題