项目的代码中时常抛出在Can't set headers after they are sent的异常,应该怎么解决?
发布于 9 年前 作者 joker0035 2798 次浏览 最后一次编辑是 8 年前 来自 问答

自己写的一个web服务后台中时常会因为Can’t set headers after they are sent的异常而崩溃,从字面意思理解应该是respnse执行两次回复导致,代码逻辑较复杂定位执行两次的原因工作量比较大,简单的try/catch感觉又不是治本之策,所以在此问下大家这种情况要怎么处理,一个简单的想法是在send之前判断response的有效性,就不知道express提供了这样的API没有

4 回复

就不能 console.log 一下堆栈信息?

可以的呀,但是还是比较难定位

感觉你这思路是不对滴~为什么会出现这个,因为调用了不止一次response.send吧,或者就是在send调用之后又setHeader了,这是非法且没有意义的操作。这肯定是代码错误,走了双重逻辑。举个简单的错误例子:

fn (err, data){//fn是任意产生数据的函数
	if(err){
		callback(err);//错!没有return
	}
	callback(null, data);
}

假如此处callback是这样的:

function(err, data){
	response.setHeader("Content-type", "application/json");
	response.send(data);
}

那必然出错~慢慢排查吧!

楼上正解,简单点的方法就是在express错误处理之前做个中间处理,将该处理捕获的异常直接catch后忽略掉,当然治本的话还是要自己排查找原因

回到顶部