2011-10-03 78 views
23

我在Node.js(使用Express和Mongoose)中有以下控制器/路由定義。當用戶請求一個不存在的頁面時,處理錯誤的最簡單最合適的方法是什麼?Node.js/Express - 頁面未找到時出現渲染錯誤

app.get('/page/:pagetitle', function(req, res) { 
     Page.findOne({ title: req.params.pagetitle}, function(error, page) { 
      res.render('pages/page_show.ejs', 
      { locals: { 
       title: 'ClrTouch | ' + page.title, 
       page:page 
      } 
      }); 
     }); 
    }); 

它目前打破我的應用程序。我相信因爲我沒有對錯誤做任何事情,我只是將它傳遞給視圖,就像成功了一樣?

TypeError: Cannot read property 'title' of null 

非常感謝。

回答

46

查看快遞error-pages示例。原則是首先註冊您的應用程序路線,然後爲所有其他未映射到路線的請求註冊一個捕獲所有404處理程序。最後,註冊500處理程序,如下所示:

// "app.router" positions our routes 
// specifically above the middleware 
// assigned below 

app.use(app.router); 

// Since this is the last non-error-handling 
// middleware use()d, we assume 404, as nothing else 
// responded. 

app.use(function(req, res, next){ 
    // the status option, or res.statusCode = 404 
    // are equivalent, however with the option we 
    // get the "status" local available as well 
    res.render('404', { status: 404, url: req.url }); 
}); 

// error-handling middleware, take the same form 
// as regular middleware, however they require an 
// arity of 4, aka the signature (err, req, res, next). 
// when connect has an error, it will invoke ONLY error-handling 
// middleware. 

// If we were to next() here any remaining non-error-handling 
// middleware would then be executed, or if we next(err) to 
// continue passing the error, only error-handling middleware 
// would remain being executed, however here 
// we simply respond with an error page. 


app.use(function(err, req, res, next){ 
    // we may use properties of the error object 
    // here and next(err) appropriately, or if 
    // we possibly recovered from the error, simply next(). 
    res.render('500', { 
     status: err.status || 500 
    , error: err 
    }); 
}); 
+0

是的,我覺得我已經通過了Express例子。但無論如何,這非常有幫助。我在視圖中創建了自己的500.ejs等等,現在可以根據需要進行渲染,但是在指定時也可以添加自己的錯誤消息。謝謝。 – tuddy

+1

當我使用404處理添加app.use()時,出於某種原因,它會將我的所有路由混入公共文件夾中。像/stylesheets/style.css一下子就會丟失,因爲它通常是從我的ejs模板訪問的。對此有何建議? – netpoetica

+0

我能夠解決這個問題,快速app.use()中間件打破我的靜態路徑通過簡單地移動app.use(靜態....)在這裏給出的例子 – netpoetica

3

Node.JS的一個主要問題是沒有乾淨的錯誤捕獲。傳統的方法通常是每一個回調函數,第一個參數是不爲空,如果有錯誤,因此,例如:

function(error, page){ 
    if(error != null){ 
     showErrorPage(error, req, res); 
     return; 
    } 
    ...Page exists... 
} 

事情太多回調一段時間後會變得非常惡劣,我建議使用就像async,這樣如果有一個錯誤,它會直接進入錯誤回調。

編輯:你也可以使用express error handling

+0

+1爲您的答案,因爲它是有幫助的。不應該有'undefined'而不是'null'。 –

+0

@SushantGupta不,** Nican **是正確的。它是空或有錯誤對象。 –