一。錯誤處理
1.500錯誤:如代碼運作過程發生錯誤,我們需要把錯誤資訊傳回給使用者。HTTP協定規定這時要傳回500狀态嗎,koa提供了ctx.throw()方法,用來抛出錯誤。
const main = ctx =>{
ctx.throw(500);
}
2.404錯誤:如将ctx.response.status設定成404,相當于ctx.thow(404),傳回404錯誤
const main = ctx =>{
ctx.response.status = 404;
ctx.response.body = 'Page Not Fo..und';
}
3.處理錯誤的中間件:為友善處理錯誤,最好用try-catch将其捕獲,但每個中間件都這麼寫就很麻煩,可以讓最外層的中間件負責所有中間件的錯誤處理。
const handler = async (ctx, next) =>{
try{
await next();
}catch(e){
ctx.response.status = e.statusCode ||e.status ||500;
}
}
const main = ctx =>{
ctx.throw(500);
}
app.use(handler);
app.use(main);
4.error事件監聽:運作過程中出錯,koa會觸發一個error事件。監聽該事件,可以處理錯誤。
const main = ctx =>{
ctx.throw(500);
};
app.on('error', (err, ctx) =>{
console.error(err);
})
5.釋放error事件:如果錯誤被try-catch捕獲,就不觸發error事件,這時必須調用ctx.app.emit(),手動釋放error事件,才能讓監聽函數生效
const handler = async (ctx, next) =>{
try{
await next();
}catch(err){
ctx.respose.status = err.statusCode ||err. status || 500;
ctx.response.type = 'html';
ctx.response.body = '<p>出錯啦</p>';
ctx.app.emit('error', err, ctx);
}
}
ctx.main = ctx =>{
ctx.throw(500);
}
app.on('error', function(err){
console.log(err);
})