2016-01-04 42 views
2

我一直試圖通過所有的答案已經這樣做,但沒有實現他們到我的代碼。我明白髮生了什麼事情之前,我提供了錯誤響應的頁面,另一個響應已發送給用戶。另一方面,我不知道如何解決這個問題。錯誤:它們發送後無法設置標頭 - Node.js

這裏是我在我的腳本拋出一個錯誤:

if (!player) { 
     next(new HttpError(404, "Player not found")); // HttpError(status, message) 
    } 

要發送此錯誤給用戶我用的方法sendHttpError.js這是這樣的:

module.exports = function(req, res, next){ 

    res.sendHttpError = function(error){ 
     if(res.req.headers['x-requested-with'] == 'XMLHttpRequest'){ 
      res.json(error); 
     }else { 
      res.render("error", {error: error}); 
     } 
    }; 
    next(); 
}; 

這是一個點點增強表達錯誤處理:

app.use(function (err, req, res, next) { 

    if(typeof err == 'number'){ 
     err = new HttpError(err); 
    } 

    if(err instanceof HttpError){ 
     res.sendHttpError(err); 
    } else{ 
     if(app.get('env') == 'development'){ 
     res.status(err.status || 500); 
     res.render('error', { 
      message: err.message, 
      error: err 
     }); 
     } else { 
     log.error(err); 
     err = new HttpError(500); 
     res.sendHttpError(err); 
     } 
    } 
    }); 

我是一個有點新的節點,並在C++來這樣的js抓住這個令人困惑的面向事件的編程是有點困難:)

提前謝謝!

回答

1

最有可能的問題就在這裏:

if (!player) { 
    next(new HttpError(404, "Player not found")); // HttpError(status, message) 
} 

放入next()調用前返回。

沒有返回,下一個函數將被調用,但是路由處理程序也將繼續執行。你可能有一個看起來像這樣的處理器:

app.get('/foo', function(req, res, next){ 
    if (!player) 
     next(new HttpError(404, "Player not found")); // HttpError(status, message) 

    res.send({res:'ok'}); 

});  

下一個函數被調用,你的錯誤處理程序。也許它會向客戶寫回應。正常的res.send然後在您的處理程序中調用,並且您將得到「無法設置處理程序錯誤」。

更有可能res.send函數首先被調用,並且錯誤將在您的快速錯誤處理程序中引發。

相關問題