2017-08-29 6 views
0

Nodejs - スローされたエラーをキャッチしてフォーマットする方法私はかなり私は深い例えば私のルート、内部のどこかに投げるエラーをキャッチする方法を理解していない

// put 
router.put('/', async (ctx, next) => { 
    let body = ctx.request.body || {} 
    if (body._id === undefined) { 
    // Throw the error. 
    ctx.throw(400, '_id is required.') 
    } 
}) 

_idが提供されていないときに私が取得します:

_id is required. 

しかし、私はドンプレーンテキストのように投げてください。私は、例えば、トップレベルでそれをキャッチし、それをフォーマット希望:

{ 
    status: 400. 
    message: '_id is required.' 
} 

docによると:

app.use(async (ctx, next) => { 
    try { 
     await next() 
    } catch (err) { 
     ctx.status = err.status || 500 

     console.log(ctx.status) 
     ctx.body = err.message 

     ctx.app.emit('error', err, ctx) 
    } 
    }) 

しかし、たとえそれが私のミドルウェアでキャッチを試みるせず、私はまだ取得します_id is required.

答えて

1

必要なステータスコードでエラーがスロー:

ctx.throw(400, '_id is required.'); 

とエラー応答フォーマットするdefault error handlerを使用します。

app.use(async (ctx, next) => { 
    try { 
    await next(); 
    } catch (err) { 
    ctx.status = err.statusCode || err.status || 500; 
    ctx.body = { 
     status: ctx.status, 
     message: err.message 
    }; 
    } 
}); 
+0

感謝を。 'ctx.throw(400、 '_idは必須です。')'は私のものです。私は別の場所で何か間違ったことをしたかもしれない! – laukok

+1

私の答えが役に立つとうれしいことですが、問題はデフォルトのエラーハンドラであり、オブジェクト '{status、message}'ではなく 'ctx.body'に文字列を割り当てました。 – alexmac

+0

良いキャッチ!ありがとうございました :-) – laukok

関連する問題