(已解决)Can't set headers after they are sent为什么会出现啊
发布于 6 年前 作者 iori2882 2740 次浏览 来自 问答

问题描述:下面是一段node.js连接redis的代码,服务端和redis分别在2个服务器上,服务器启动,代码是正常的,点击指定测试连接能进入到下面的蓝色箭头所指代码,并提示连接redis服务器成功.这时候我把redis服务器断开连接(模拟redis服务器意外关闭),这时候在点击测试连接就提示Can’t set headers after they are sent,不是应该直接返回红色箭头所指的json数据么?对了 用await写就没问题,是不是回调的问题啊?出于某些原因,这里不能用await 2222.jpg ### 1111.jpg

7 回复

好像是 res 被发送了两次 ,实在是迷糊

end 和 error 事件都触发了,所以你调用了 2 次 res.json

结贴:同一个res调用2次,就会出现这样的问题…

你的res出现的位置比较奇特。

按理说Redis是在全局初始化,然后在request的处理过程中调用的;但你的代码看起来好像是一个request进来,再在request处理过程内初始化Redis连接;这样导致的结果是每一个request进来都会新建一个Redis的连接。

事件是异步触发的,你的代码显示在Redis连接出问题的时候会调用res.json(),但是如果你在事件返回之前就调用过res返回response了,这时候Redis连接出问题就会第二次调用res来返回response。一个request只能返回一次response,这个是HTTP原理上规定的,你response多次肯定就会报这个错。

个人感觉楼主并不理解Node的异步非阻塞机制,也不理解Redis驱动的工作原理,建议先去了解学习一下,否则会遇到很多很困惑的问题。

@libook 你说的对,之前我考虑的是在PM2的集群模式下 使用redis的长连接是否有问题…如果没问题,我就直接redis全局初始化了,同时确实不太理解异步机制和redis驱动原理

为什么不考虑node_redis 和 ioredis 的连接池

@zhhb node_redis有连接池么???没看到相关设置啊!

回到顶部