Angular客户端连接Node端Socket.IO出现writeHead未定义错误如何解决
报错排查解决步骤
- 检查Socket.IO两端版本匹配性
Socket.IO大版本不兼容是触发该报错的最高频原因,v2和v3/v4版本的握手协议完全不同,混用就会触发握手阶段的异常。分别执行命令查看版本:- 服务端执行:
npm list socket.io - 客户端执行:
npm list socket.io-client
若大版本不一致,统一升级到最新v4版本即可:
服务端安装命令:npm install socket.io@latest
客户端安装命令:npm install socket.io-client@latest
- 服务端执行:
- 移除客户端过时的传输配置
Socket.IO v3及以上版本已经完全废弃flashsocket传输方式,你配置中添加的该无效参数会导致握手请求参数异常,触发engine.io的处理错误。将客户端初始化代码修改为:
this.socket = io("http://localhost:3000", {transports: ['websocket', 'polling']});
- 补充服务端CORS配置
Angular默认运行在4200端口,和Socket.IO的3000端口存在跨域,Socket.IO v3+需要显式配置跨域规则,修改服务端IO初始化代码:
const io = new Server(server, { cors: { origin: "http://localhost:4200", // 若修改过Angular启动端口请替换为实际地址 methods: ["GET", "POST"] } });
- 排查端口占用和请求冲突
如果以上步骤都执行完仍报错,检查3000端口是否被其他服务占用,或者服务端是否同时引入了其他WebSocket库(如ws),多个库同时处理HTTP升级请求会产生冲突,临时关闭其他服务/库再测试即可。
内容的提问来源于stack exchange,提问作者Steve Lennon
相关产品推荐
相关产品推荐

