2016-06-21 15 views
0

エラーを適切に処理する方法については頭を悩ますことができません。は、リダイレクトとメッセージでエラーを処理する方法を表現します。

基本的な404は問題ありません(単純にヘッダー404を設定し、「見つかりません」ページを表示します)。たとえば、次のようにします。

ユーザーはIDで検索されますが、ユーザーは存在しません。ヘッダーのステータスを500に設定するとします。しかし、ページをリダイレクトする(またはリダイレクトページを割り当てる)と、フラッシュメッセージを設定する方法はありますか?

私は通常、次を見つけるほとんどのチュートリアルで

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番目の部分では、ステータスは提供されていません。

あなたはどのような慣行を実装していますか?

答えて

2

私は私の明示的なアプリケーションで中央エラー処理の巨大なファンです。これはどのように作動しますか?まあ、私はすべてのHTTPエラーオブジェクトのライブラリを持って、それらの上に 'ステータス'プロパティがあります。すべてのルートハンドラとmiddewareは、何が起こったかに応じてこれらのエラーオブジェクトの1つでコールバックを返し、エラーがあった場合は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

関連する問題