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
相关产品推荐
相关产品推荐

