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

NodeJS使用ws库初始化WebSocket.Server报参数错误求助

问题原因及修复方案

1. WebSocket构造函数报错修复

报错核心原因是ws库的Server构造函数配置项属性名不符合要求:
ws规定传入已有的HTTP服务实例时,配置对象的key必须为server,你代码中写的{ http_server }是ES6对象属性简写,等价于{ http_server: http_server },ws无法识别这个自定义key,判定你未传入port/server/noServer三个必填互斥参数中的任意一个,因此触发报错。
修复代码:

const websockets_server = new WebSocket.Server({ server: http_server });

2. WebSocket连接回调逻辑修复

你在connection事件回调中错误使用了整个WebSocket库对象绑定事件、发送消息,应该使用回调返回的当前客户端连接实例ws操作,同时需要删除TypeScript类型注解(原生JS不支持该语法):

websockets_server.on("connection", (ws) => {
  // 绑定当前连接的消息接收事件
  ws.on("message", (message) => {
    console.log("received: %s", message);
    // 给当前连接的客户端返回消息
    ws.send(`Hello, you sent -> ${message}`);
  });
  // 给新建立的连接发送欢迎消息
  ws.send("Hi there, I am a WebSocket server");
});

3. POST请求处理补充(匹配你的需求)

你需要处理传感器上报的POST请求,可给HTTP服务添加request事件监听,收到数据后通过WebSocket推送给连接的APP端:

http_server.on('request', (req, res) => {
  // 处理跨域(可选,根据你的前端地址调整)
  res.setHeader('Access-Control-Allow-Origin', '*');
  if (req.method === 'POST') {
    let postData = '';
    // 接收POST请求体
    req.on('data', chunk => {
      postData += chunk.toString();
    });
    req.on('end', () => {
      console.log('收到传感器上报数据:', postData);
      // 推送数据给所有已连接的WebSocket客户端(即你的APP)
      websockets_server.clients.forEach(client => {
        if (client.readyState === WebSocket.OPEN) {
          client.send(postData);
        }
      });
      res.end('数据上报成功');
    });
  } else {
    res.statusCode = 405;
    res.end('仅支持POST请求');
  }
});

4. 冒号语法说明

你看到的冒号分两种场景:

  • 原生JS对象中的冒号:用于分隔属性名和属性值,比如{ port: 4444 }表示对象的port属性值为4444
  • 参数后的: 类型语法:属于TypeScript专属的类型注解,用来标注变量/参数的预期类型,不属于原生JS语法,只有配置了TS编译环境的项目才能正常识别,普通JS项目直接删除即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 17:45:03