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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值