Node.js HTTP服务器中Socket的ready事件无法触发,问题出在哪?
Node.js中socket的
ready事件未触发问题 最近我在研究Node.js源码时遇到了一个问题。以下是我的代码:
const http = require("http"); const server = http.createServer(function (request, response) { response.end("hello"); }); server.listen(3000, function () { console.log("Runing on port 3000"); }); server.on("connection", function (socket) { console.log("connection received, let's listen event 'ready'"); socket.on('ready', (...args) => console.log("ready", args)); })
这段代码中的ready事件始终无法被触发,请问我哪里操作有误或者遗漏了什么?
官方文档说明(中文翻译)
事件:
'ready'
当套接字准备好可用时触发。
问题原因
你绑定ready事件的时机太晚了。对于HTTP服务器生成的net.Socket实例,ready事件会在socket初始化完成、具备读写能力时就触发,而服务器的connection事件是在TCP连接完全建立后才触发的——这时候ready事件早已经执行过了,后续绑定的监听器自然接收不到这个事件。
解决方案
直接在
connection回调中执行逻辑
实际上,connection事件触发时,socket已经处于可用状态,完全可以把你原本要放在ready事件回调里的逻辑直接写在connection的回调中:server.on("connection", function (socket) { console.log("connection received, socket is ready to use"); // 这里直接执行原本ready事件里的逻辑 })提前绑定
ready事件(不推荐)
如果一定要监听ready事件,可以通过prependListener提前注入监听器,但这种方式依赖内部事件触发顺序,不够直观且没必要:server.on("connection", function (socket) { socket.prependListener('ready', (...args) => console.log("ready", args)); })
内容的提问来源于stack exchange,提问作者MaximPro
相关产品推荐
相关产品推荐

