天天看點

【知識整理】Node.js-Koa之錯誤處理

一。錯誤處理

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);
})
           

繼續閱讀