You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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事件早已经执行过了,后续绑定的监听器自然接收不到这个事件。

解决方案

  1. 直接在connection回调中执行逻辑
    实际上,connection事件触发时,socket已经处于可用状态,完全可以把你原本要放在ready事件回调里的逻辑直接写在connection的回调中:

    server.on("connection", function (socket) {
      console.log("connection received, socket is ready to use");
      // 这里直接执行原本ready事件里的逻辑
    })
    
  2. 提前绑定ready事件(不推荐)
    如果一定要监听ready事件,可以通过prependListener提前注入监听器,但这种方式依赖内部事件触发顺序,不够直观且没必要:

    server.on("connection", function (socket) {
      socket.prependListener('ready', (...args) => console.log("ready", args));
    })
    

内容的提问来源于stack exchange,提问作者MaximPro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 23:17:35