2016-10-19 9 views
0

私のアプリでユーザーを作成するには次の機能があります。エラーが発生したときに処理されなかった 'エラー'イベント

export async function createUser (ctx) { 
    if (ctx.request.body.type == undefined ) { 
     ctx.throw(400, 'Bad Request') 
    } 
    if (ctx.request.body.type === 'admin') { 
    User.findOne({type:'admin'}, (err, usr) => { 
     if (err) 
     ctx.throw(422, err.message) 
     if (usr){ 
     ctx.throw(400, 'Duplicate Admin') 
     } 
    }) 
    } 
.... 

最初ctx.throw(400, 'Bad Request')作品が、別の管理者ユーザーはctx.throw(400, 'Duplicate Admin')アプリクラッシュ、次のエラーが発生します発見された場合:

events.js:160 
     throw er; // Unhandled 'error' event 
    ^

BadRequestError: Duplicate Admin 

私が不十分な方法でエラーを投げてるの?何が最初のスローをクラッシュせずに動作させますが、2番目のスローは動作させませんか?まず任意のヘルプ

答えて

0

を追加してみてください。これはクラッシュします。

代わりに、User.findOneを提供するライブラリを見て、それが約束を返すかどうかを確認します。そうでない場合は、ブルーバードのPromise.promisifyにラップしてください。

これは、あなたが到着するコードです:

const user = await User.findOne({ type: 'admin' }) // returns a promise 
if (user) ctx.throw(400, 'Duplicate admin') 
0

を事前に

おかげで、「ユーザー」variable.Ifその配列やオブジェクトの種類を確認し、if(user){....}は常にそれが空だ場合でも、trueを返します。そして、あなたがUser.findOneコールバック内で非同期に投げている

app.on('error', function() { 
    console.log('yep this is an error'); 
}); 

イベントリスナー

関連する問題