0

単純化されたコード...しかし、基本的なシナリオは、ユーザーを検索するためにMongoでfindOneクエリを実行していますが、ユーザーが存在しない場合、Webサーバー全体をクラッシュさせるエラーをスローします. これらのエラーを正しくラップして、すべてがダウンしないようにするために、誰かが私を正しい方向に向けることができますか?

ルート:

server.get('/v1/user/:token', function(req,res){
    console.log("user endpoint hit");
    var user = users.findOne({token:req.params.token}, function(err,user){
        if (user) {
            res.json({token:user.token,credits:user.credits,subscribed:user.subscribed,searches:user.searches});
        } else {
            console.log("DB error in lookup user");
            throw new DBError("Error looking up user in get endpoint");
        }
    });
});

DBError 宣言:

function DBError(msg) {
    this.name = "DBError";
    console.log("DBError " + msg);
    Error.call(this,msg);
    Error.captureStackTrace(this, arguments.callee);
}

エラーを処理するチャンクは次のとおりです。

server.error(function(err, req, res, next){
    if (err instanceof NotFound) {
        res.send(404,{error: "404 Not Found"});
    }
    else if (err instanceof DBError) {
        res.send(400, {error: "Database error"});
    } else {
        res.send(500,{error:"500 internal error"});
    }
});

ここで単体テストを実行すると、スタックトレースが表示され、サーバープロセスが終了します (理想的ではありません!):

user endpoint hit
DB error in lookup user
DBError Error looking up user in get endpoint

/Users/msencenb/Development/nodeProjects/reversePhoneLookup/server/app/node_modules/mongodb/lib/mongodb/connection/server.js:563
        throw err;
              ^
[object Object]
4

1 に答える 1

1

一般に、エラーをスローしません。エラーは、何かがひどくうまくいかないときにプロセス/ワーカーをシャットダウンすることになっています。上記のコードでユーザーが見つからないことは、ひどく間違っているとは思いませんが、特定のケースによっては、決して起こらないはずのものである可能性があります。

ただし、エラーを処理する必要がある場合、最も一般的な方法 [要出典] は、それをコールバックの最初の引数として渡すことです (のコールバックでわかるようにfindOne())。Express では、 と呼ばれるミドルウェアの 3 番目のパラメーターnextとエラー ハンドラーを使用して実行されます。たとえば、次のようにします。

あなたのルート:

server.get('/v1/user/:token', function(req,res,next){
    console.log("user endpoint hit");
    var user = users.findOne({token:req.params.token}, function(err,user){
        if (user) {
            res.json({token:user.token,credits:user.credits,subscribed:user.subscribed,searches:user.searches});
        } else {
            next(new DBError("Error looking up user in get endpoint"));
        }
    });
});

ミドルウェアを使用するエラー ハンドラを指定します。

app.use(function(err, req, res, next){
  // This will handle all errors sent through next()
  console.error(err.stack);
  res.send(500, 'Something broke!');
});

また、ノード内のドメインを確認することもできます。そのページでは、エラーに適切に対応する方法についても触れています。

于 2013-06-09T20:52:24.807 に答える