nodeJs編寫錯誤處理中間件問題

nodeJs編寫錯誤處理中間件

app.use(async(ctx, next) => {
    try {
        await next();
    } catch (err) {
        console.log(err, "錯誤機制");
        ctx.status = err.status || err.statusCode;
        ctx.body = {
            message: err.message
        };
    }
})

koa-json-error 處理錯誤機制:

const koajsonerror = require("koa-json-error");
app.use(koajsonerror({
    postFormat: (err, { stack, ...rest }) => process.env.NODE_ENV === "production" ? rest : { stack, ...rest }
}));

溫馨提示:放在最前面

Connect中間件之錯誤處理中間件

范例

var connect = require('connect');
connect()
	.use(errorHandler())
	.listen(3000);
 
/* 錯誤處理中間件函數必須接受四個參數:err, req, res和 next */
/* 而常規的中間件隻有三個參數:req,res和next */
/* 當Connect遇到錯誤時,它隻調用錯誤處理中間件 */
function errorHandler() {
	var env = process.env.NODE_ENV || 'development';
	return function(err, req, res, next) {
		res.statusCode = 500;
		switch (env) {
			case 'development':
				res.setHeader('Content-Type', 'application/json');
				res.end(JSON.stringify(err));
				break;
			default:
				res.end('Server error');
		}
	}
}

多個錯誤處理中間件組件

var connect = require('connect');
var api = connect()
	.use(users)
	.use(pets)
	.use(errorHandler);
var app = connect()
	.use(hello)
	.use('/api', api)
	.use(noPage)
	.use(errorPage)
	.listen(3000);
 
 
// hello 中間件組件
function hello(req, res, next) {
	if (req.url.match(/^\/hello/)) {
		res.end('Hello World\n');
	} else {
		next();
	}
}
 
// users 中間件組件
var db = {
	users: [
		{name: 'tobi'},
		{name: 'loki'},
		{name: 'jane'}
	]
};
function users(req, res, next) {
	var match = req.url.match(/^\/user\/(.+)/);
	if (match) {
		var user = db.users[match[1]];
		if (user) {
			res.setHeader('Content-Type', 'application/json');
			res.end(JSON.stringify(user));
		} else {
			var err = new Error('User not found');
			err.notFound = true;
			next(err);
		}
	} else {
		next();
	}
}
 
// pets 中間件組件
function pets(req, res, next) {
	if (req.url.match(/^\/pet\/(.+)/)) {
		foo();
	} else {
		next();
	}
}
 
// errorHandler 錯誤處理中間件組件
function errorHandler(err, req, res, next) {
	console.error(err.stack);
	res.setHeader('Content-Type', 'application/json');
	if (err.notFound) {
		res.statusCode = 404;
		res.end(JSON.stringify({error: err.message}));
	} else {
		res.statusCode = 500;
		res.end(JSON.stringify({error: 'Internal Server Error'}));
	}
}
 
// noPage 中間件組件
function noPage(req, res, next) {
	res.statusCode = 404;
	res.end('Not Found');
}
 
// errorPage 錯誤處理中間件組件
function errorPage(err, req, res, next) {
	res.end('Impossible');
}

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: