2017-04-12 14 views
2

私はNode.jsにRestifyアプリケーションを書いていますRestifyコールバック内のエラーが発生したときに呼び出される関数が必要です。この関数は、クライアントに応答を送信する必要があります。私は約束または非同期機能を使用していない場合は、私はそのような何かを行うことができます。Restifyミドルウェアで未処理のPromise拒否を取得するにはどうすればよいですか?

server.on('uncaughtException', (req, res, route, err) => { 
    log.error(err); 
    res.send(err); 
}); 

しかし、私のコールバックがasync関数の場合、その関数の内部例外が呼び出されていない、とunhandledPromiseRejectionが代わりに発生します。

通常のエラーを処理するのと同じ方法で未処理のPromiseの拒否を処理するように、コードをどのようにリファクタリングすることができますか?

そして、はい、それは

if (!core.validateUUID(req.params.deviceId)) { 
    throw new Error(`Device ${req.params.deviceId} is wrong`) 
} 

を書くために簡単です、私はRestifyミドルウェア自体の内部エラーをチェックできることを知っているが、まだそれは、コードが複雑になり、その後

if (!core.validateUUID(req.params.deviceId)) { 
    return next(new restify.InvalidArgumentError({ body: { 
    success: false, 
    error: `Device ${req.params.deviceId} is wrong`, 
    } })); 
} 
+1

あなたは "unhandledRejection"イベントを単に聞くことはできませんか? https://nodejs.org/api/process.html#process_event_unhandledrejection –

+0

@MattDiamond私はできますが、私は 'req'と' res'オブジェクトを得ることができません。私は 'res 'エラーの詳細をユーザーに返すオブジェクト – serge1peshcoff

答えて

1

Iこれとしばらくの間苦労していたので、簡単な解決策を思いつきました。私は、ルートハンドラ/ミドルウェアをラップし、約束の中でコードを実行する単純なラッパー関数を作成しました。

// your error general handler 
function errorResponse(req, res, err) { ... } 

/** 
* When using promises inside handler, you need to return the Promise from it to allow proper rejection handling 
* 
* @param {Function} callback with `req`, `res` and `next` parameters 
* @returns {Function} 
*/ 
function catcher(callback) { 
    return (req, res, next) => { 
    Promise 
     .resolve() 
     .then(() => callback(req, res, next)) 
     .catch(err => errorResponse(req, res, err)); 
    }; 
} 

// use it like this 
server.use(catcher(middleware1)); 
server.post(catcher(postRoute)); 
server.get(catcher(getRoute)); 

あなたのハンドラ内の約束を使用して、あなたは適切な拒絶が取り扱い可能にし、それから約束を返す必要があります、未処理の拒否やキャッチされない例外が処理できる方法は、同じコールバックです。

関連する問題