2013-01-18 46 views
0

您好我發展我第一次的Node.js應用程序,我發現我的第一個問題很基本的東西,我不能趕上HTTP錯誤(404,500,... )如何管理Node.js的HTTP錯誤

我已經試過了DOC(我是這麼認爲的),但我想我失去了一些東西。

這是我的代碼:

var express = require('express') 
app = express() 
app.use(express.logger('dev')); 

app.get('/', function(req, res) { 
    res.send('Hellow World!!!') 
}) 
app.use(app.router); 
app.use(function(err, req, res, next) { 
    console.error('Oh!! ERROR'); 
    console.error('My ERROR: ' + JSON.stringify(err)); 
}); 

app.listen(3000); 
console.log('Server running at http://127.0.0.1:3000/'); 

在此先感謝。

回答

2

於是方式表達作品是如果它擊中中間件和路由處理程序的整個堆棧的結束並沒有什麼迴應的是,它會自動發送回退404響應而不產生錯誤。這就是爲什麼你的錯誤處理中間件沒有被調用。默認情況下,express不考慮404錯誤,這可能是正確的思路。

如果你想定製這個,你可以把一箇中間件放在堆棧的最後,直接提供一個自定義的404頁面,或者如果你喜歡這種方式,可以打電話next,出現錯誤。

app.get('/'... 
app.get('/two'... 
app.get(/'three'... 

app.use(middleware1... 
app.use(middleware2... 
app.use(app.router); 
app.use(function (req, res, next) { 
    //Option 1: respond here 
    return res.status(404).render('my_404_view'); 
    //Option 2: trigger error handler 
    return next(new Error('404ed!')); 
} 

選項2將觸發您的錯誤處理中間件。在那裏,您將不得不從錯誤對象獲取信息以確定要呈現的所需視圖以及要發送的狀態代碼。我個人定義了一個errors.NotFound類,它有一個404代碼,可以讓我呈現一個友好的404頁面視圖。

+0

喜@彼得 - 里昂,感謝您的快速回答,現在我的錯誤中間件被觸發,但我有一個問題,它總是觸發,即使路線被找到(和頁面正確返回)。我雖然如果其中一條路線迴應中間件的其餘部分沒有觸發......我錯了嗎? – Roberto

+1

你在渲染頁面後調用'next()'嗎?一旦頁面呈現,你不應該調用'next()'。只從位於處理堆棧「中間」的中間件調用'next()'。 –

+0

這是非常奇怪的只觸發第一次,第二次調用工作正常,路線是這樣的: app.get(「/」,函數(REQ,RES){ res.send(「索引頁!」 ) //中間件頁面僅觸發第一次 }) – Roberto