如何优化WebSocket的onmessage?并实现接收数据MongoDB日志器
嘿,我来帮你搞定这个WebSocket日志器,把收到的消息稳稳存入MongoDB。先看你现有的代码,我会一步步补全并讲清楚每个关键点~
完整实现方案
1. 先完善MongoDB控制器(db-controller.js)
你的代码依赖了./db-controller,但没给出这个文件的实现,我先写一个实用的封装版本,处理MongoDB的连接、数据插入和资源清理:
// db-controller.js const { MongoClient } = require('mongodb'); class DBAbstract { constructor() { this.client = null; this.db = null; this.collection = null; // 初始化连接 this.connect(); } async connect() { try { // 替换成你的MongoDB连接字符串,有认证的话格式是 mongodb://user:password@host:port/dbname this.client = await MongoClient.connect('mongodb://localhost:27017'); this.db = this.client.db('ws_logs'); // 自定义数据库名 this.collection = this.db.collection('messages'); // 存储日志的集合名 console.log('✅ MongoDB连接成功'); } catch (err) { console.error('❌ MongoDB连接失败:', err); // 连接失败直接退出进程,避免后续报错 process.exit(1); } } // 保存WebSocket消息到MongoDB async saveMessage(data) { if (!this.collection) { console.error('⚠️ MongoDB还未连接,无法保存数据'); return; } try { // 把收到的字符串转成JSON(如果消息是JSON格式的话),也可以直接存字符串 let messageData = typeof data === 'string' ? JSON.parse(data) : data; // 加上接收时间戳,方便后续查询统计 messageData.receivedAt = new Date(); await this.collection.insertOne(messageData); console.log('📥 数据已成功存入MongoDB'); } catch (err) { console.error('❌ 保存数据到MongoDB失败:', err); } } // 关闭MongoDB连接 async close() { if (this.client) { await this.client.close(); console.log('🔌 MongoDB连接已关闭'); } } } module.exports = DBAbstract;
2. 最终的listener.js代码
补全你原来的代码,加上错误处理、异步数据存储和资源清理逻辑:
'use strict'; let DBAbstract = require('./db-controller'); const WebSocket = require('ws'); // 初始化MongoDB实例 let mongoInstance = new DBAbstract(); // 替换成你的实际WebSocket服务地址 const ws = new WebSocket('ws://ws-url'); ws.onopen = function() { console.log('🔗 WebSocket连接已打开'); }; // 处理收到的消息,用async/await等待数据库操作完成 ws.onmessage = async function(event) { console.log('📩 收到WebSocket消息:', event.data); await mongoInstance.saveMessage(event.data); }; // 监听WebSocket错误 ws.onerror = function(error) { console.error('❌ WebSocket发生错误:', error); }; // 监听WebSocket关闭事件,清理数据库连接 ws.onclose = function(event) { console.log('🔌 WebSocket连接已关闭,代码:', event.code, '原因:', event.reason); mongoInstance.close(); }; // 处理进程退出信号(比如Ctrl+C),确保资源都被清理 process.on('SIGINT', async () => { console.log('\n🛑 进程即将退出,正在清理资源...'); ws.close(); await mongoInstance.close(); process.exit(0); });
3. 关键细节说明
- 异步处理:MongoDB操作是异步的,所以
onmessage回调要用async,并通过await等待数据保存完成,避免出现未处理的Promise错误。 - 数据格式兼容:如果你的WebSocket消息是JSON字符串,代码会自动解析成JSON对象存入;如果是纯文本,也能直接存储,兼容性拉满。
- 错误捕获:不管是MongoDB连接失败、WebSocket出错还是数据存储失败,都有对应的错误日志,方便排查问题。
- 资源清理:在WebSocket关闭或进程退出时,都会主动关闭MongoDB连接,避免资源泄漏。
4. 部署步骤
- 安装依赖:在项目根目录运行
npm install ws mongodb - 替换配置:把代码中的
ws://ws-url换成你的实际WebSocket服务地址,把MongoDB连接字符串换成你的数据库地址 - 启动脚本:运行
node listener.js,就能看到连接日志和消息存储状态啦
内容的提问来源于stack exchange,提问作者Samy
相关产品推荐
相关产品推荐

