32

私は完全な NodeJS 初心者で、Express と Mongoose を使用して単純な REST Web サービスを作成したいと考えています。

Mongoose のエラーを 1 か所で処理するためのベスト プラクティスは何ですか?

データベース エラーが発生した場合は、エラー メッセージとともに Http-500-Error-Page を返したいと思います。

if(error) {
  res.writeHead(500, {'Content-Type': 'application/json'});
  res.write('{error: "' + error + '"}');
  res.end();
}

古いチュートリアルhttp://blog-next-stage.learnboost.com/mongoose/で、グローバル エラー リスナーについて読みました。

Mongoose.addListener('error',function(errObj,scope_of_error));

しかし、これは機能していないようで、このリスナーに関する公式の Mongoose ドキュメントで何かを見つけることができません。Mongo リクエストごとにエラーをチェックする必要がありますか?

4

1 に答える 1

47

Express を使用している場合、エラーは通常、ルート内で直接処理されるか、mongoose の上に構築された API 内で処理され、エラーが に転送されnextます。

app.get('/tickets', function (req, res, next) {
  PlaneTickets.find({}, function (err, tickets) {
    if (err) return next(err);
    // or if no tickets are found maybe
    if (0 === tickets.length) return next(new NotFoundError));
    ...
  })
})

カスタマイズされたメッセージを提供するために、エラー ハンドラー ミドルウェアNotFoundErrorで盗聴される可能性があります。

ある程度の抽象化は可能ですがnext、エラーをルート チェーンに渡すには、メソッドにアクセスする必要があります。

PlaneTickets.search(term, next, function (tickets) {
  // i don't like this b/c it hides whats going on and changes the (err, result) callback convention of node
})

マングースのエラーを一元的に処理することに関して言えば、すべてを処理する場所は実際には 1 か所ではありません。エラーは、いくつかの異なるレベルで処理できます。

connectionconnectionモデルが使用している上でエラーが発生するため、

mongoose.connect(..);
mongoose.connection.on('error', handler);

// or if using separate connections
var conn = mongoose.createConnection(..);
conn.on('error', handler);

典型的なクエリ/更新/削除の場合、エラーはコールバックに渡されます。

PlaneTickets.find({..}, function (err, tickets) {
  if (err) ...

コールバックを渡さない場合、モデルをリッスンしている場合、モデルでエラーが発生します。

PlaneTickets.on('error', handler); // note the loss of access to the `next` method from the request!
ticket.save(); // no callback passed

modelコールバックを渡さず、レベルでエラーをリッスンしていない場合、エラーはモデルで発行されますconnection

ここで重要なことは、next何らかの方法でアクセスしてエラーを渡すことです。

于 2012-08-18T05:39:46.947 に答える