2017-04-19 4 views
0

私は+ node.jsを新しく表現しているので、残りのapiはmongooseを使って書かれています。どのようなデータベースエラーなどのランタイムエラーを処理する最善の方法は?Expressアプリケーションでランタイムエラーを処理するにはどうすればよいですか?

私はこのエラーを処理するためにミドルウェアfunction(err, res, req, next)を持つことができ、この関数はnext(err)を呼び出すことしかできないことをエクスプレスドキュメントで読みました。

const find = (email, password) => { 
    User.find({ email: email }, (err, doc) => { 
    if (err) { 
     // handle error 
    } 
    return doc; 
    }); 
}; 

その後、あなたは別のファイルにルートのハンドラを持っている:

router.get('/users', (req, res) => { 
    userController.find(req.body.email); 
}); 

だから、でそれはあなたがUser moongoseモデルを持っており、コントローラにこの関数を書く想像し、大丈夫ですこの点では、モデルにthrow(err)と書いているmongoエラーを処理し、コントローラー内のtry/catchを使用してnext(err)を呼び出すことはできますか?しかし、私はJavaScriptでtry/catchを使用することは新しい実行コンテキストなどを作成するため、良い方法ではないことをお読みになりました。

Expressでこのエラーを処理する最も良い方法は何ですか?

+2

'てみてください/ catch'文を使うことには何も問題はありません。個人的には、エラーハンドリングのために '.catch'を使うことができるように、' Promises'を作成するアプローチに行きます。 –

答えて

1

約束を使用することをお勧めします。コードをよりクリーンにするだけでなく、エラー処理もずっと簡単です。参考のためにthisまたはthisにアクセスしてください。

あなたがmongooseを使用している場合は、あなた自身の約束のライブラリをプラグインすることができます。

const mongoose = require('mongoose'); 
mongoose.connect(uri); 

// plug in the promise library: 
mongoose.Promise = global.Promise; 

mongoose.connection.on('error', (err) => { 
    console.error(`Mongoose connection error: ${err}`) 
    process.exit(1) 
}) 

、以下のようにそれを使用します。

コントローラで:ルータで

const find = (email) => { 
    var userQuery = User.find({ email: email }); 
    return userQuery.exec(); 
}; 

router.get('/users', (req, res) => { 
    userController.find(req.body.email).then(function(docs){ 
     // Send your response 
    }).then(null, function(err){ 
     //Handle Error 
    }); 
}); 
関連する問題