2016-06-21 129 views
0

我似乎無法圍繞如何正確處理錯誤。表達如何處理重定向和消息的錯誤

基本的404,沒有問題(只需設置標題404和渲染'找不到'頁面)。但是讓我們舉個例子吧:

您可以通過id找到一個用戶,但該用戶不存在。我想爲此設置標題狀態爲500.但是,如何將頁面重定向回來(或簡單地指定一個重定向頁面)並設置一個flashmessage?

在大多數教程我經常發現以下幾點:每當發生錯誤

model.SignUp.forge({id: req.params.id}).fetch({withRelated: ['usermeta']}).then(function(user) { 
    res.render('admin/pages/users/details', {title: 'Signups', error: false, details: user}); 
    }).catch(function(err) { 
    res.status(500).json({error: true, data: {message: err.message}}); 
    }); 

你只要抓住問題。我也碰到過這樣有時會:

transporter.sendMail(mailOptions, function(err) { 
    if(err) { 
     req.flash('error', 'blablabla'); 
     res.redirect('back'); 
    } 
}); 

在第一種情況下,你返回一個JSON文件,但沒有重定向或渲染。在第二部分中沒有提供任何地位。

你們實施了哪些做法?

回答

2

我是我的快速應用程序中央處理錯誤的狂熱粉絲。這個怎麼用?那麼,我有一個HTTP錯誤對象庫,它們都有一個'status'屬性。我的所有路由處理程序和middeware都會根據發生的情況返回其中一個錯誤對象的回調,如果發生錯誤,請不要調用res.send(或任何其他res。*方法)。然後,我有一個錯誤處理中間件(或多個,如果它變得複雜)決定我是否想要做重定向或只發送響應代碼,或根據應用程序的需要發送什麼。

以你的例子:

app.post('/signup', function(req, res, next){ 
    model.SignUp.forge({id: req.params.id}).fetch({withRelated: ['usermeta']}).then(function(user) { 
    res.render('admin/pages/users/details', {title: 'Signups', error: false, details: user}); 
    }).catch(function(err) { 
    return next(new HttpServerError(err)); 
    }); 
} 

的HttpServerError具有500的status,所以我至少有一個「所有」錯誤處理中間件,它看起來像這樣(在一個JSON API的情況下) :

app.use(function(err, req, res, next){ 
    console.log(err.stack); 
    res.status(err.status).send({message: err.clientMessage}); 
}); 

還可以做的多個處理程序,並呈現或基於所述請求的狀態重定向(例如接受標題或錯誤的類型)。例如,在傳統的Web應用程序中,我可能會使用錯誤的名稱來確定要呈現的模板,如果出現403錯誤,我可能會重定向到登錄頁面。

爲了完整起見,這裏是一個例子HttpServerError:

'use strict'; 

const util = require('util'); 

function HttpServerError(message){ 
    this.message = message; 
    this.clientMessage = 'Dangit! Something went wrong on the server!'; 
    this.status = 500; 
    Error.captureStackTrace(this, NotFoundError); 
} 

util.inherits(HttpServerError, Error); 

HttpServerError.prototype.name = 'HttpServerError'; 

module.exports = HttpServerError; 
+0

一點題外話,集中你所有的錯誤處理成一對夫婦中間件功能也使得它,如果你想了解更多詳細信息,一個更容易改變自己的行爲在開發或測試環境中。 – Paul