Node.js监听MongoDB集合变更遇副本集相关报错如何解决
问题修复方案
1. 完成副本集初始化
你启动mongod时已经指定了副本集参数,但还没有对副本集执行初始化操作,这是报错的核心原因。操作步骤如下:
- 保持当前运行的mongod进程不关闭,新开一个终端窗口,执行
mongosh(旧版本Mongo用mongo命令)进入Mongo shell - 在shell中执行初始化命令,注意
_id值要和你启动时--replSet指定的名称保持一致:
rs.initiate({ _id: "rs0", members: [ { _id: 0, host: "localhost:27017" } ] })
- 执行
rs.status()查看副本集状态,当返回结果中myState字段值为1时,代表当前节点已经成为正常运行的主节点,之前的刷新key缓存报错会自动消失。
2. 调整Node.js连接配置
副本集初始化完成后,需要修改MongoDB连接字符串,补充副本集参数,示例格式如下:
mongodb://localhost:27017/你的数据库名?replicaSet=rs0
如果你使用Mongoose作为ODM,也要确保连接配置中明确指定了replicaSet名称为rs0,避免后续调用watch方法时仍然报错。
3. 补充change stream异常捕获(可选)
建议你给监听逻辑增加错误事件处理,避免Mongo连接波动导致服务崩溃,修改后的代码参考:
startAlertBot(): void { console.log("Starting Bot"); const changeStream = this.alertModel.watch(); changeStream.on("change", (data) => { console.log("data", data); }); changeStream.on("error", (err) => { console.error("Change stream error:", err); // 可根据需要增加自动重连逻辑 setTimeout(() => this.startAlertBot(), 10000); }); }
内容的提问来源于stack exchange,提问作者Code Guru
相关产品推荐
相关产品推荐

