Node.js接入MongoDB存储0-9999时遇到27017端口连接拒绝错误
问题排查与解决方案
直接报错原因定位
报错核心为ECONNREFUSED 127.0.0.1:27017,本质是本地27017端口无可用的MongoDB服务进程监听,按以下步骤排查:
- 检查本地MongoDB服务状态
Windows系统可在系统服务面板查看MongoDB服务是否处于运行状态;也可执行mongo --eval "db.runCommand({ping:1})"测试本地连通性,如果返回相同的连接拒绝错误,说明服务未正常启动 - 检查端口监听状态
执行netstat -ano | findstr 27017,如果无输出结果,说明没有进程在该端口监听;如果MongoDB实际运行在其他端口,需修改代码中的连接URL端口与实际服务端口保持一致 - 检查MongoDB绑定地址配置
如果MongoDB配置文件中的bindIp未包含127.0.0.1,会导致本地回环地址无法访问服务,需修改配置将127.0.0.1加入绑定地址列表,重启MongoDB服务后再测试连接
代码设计缺陷
即使MongoDB服务正常启动,现有代码也会出现运行异常,需修正以下问题:
- 连接创建逻辑错误:原代码每执行一次
add方法就新建一个MongoClient,10000次循环会创建10000个独立连接,不仅性能极差,还会快速耗尽系统端口资源,正确做法是全局复用同一个MongoDB连接 - 异步调用未等待:原代码for循环中直接调用
add(a,i)但没有加await,同步循环会瞬间跑完10000次函数调用,发起海量并发连接请求,这也是控制台先快速输出完所有循环值、延迟后才抛出连接错误的核心原因 - 错误的Promise封装:原
add函数使用new Promise(async (resolve, reject) => {})的反模式写法,会导致异步流程的错误捕获失效,后续异常无法正常被外层捕获 - 初始变量类型错误:原代码开头定义
var a = []为数组,后续用a += i + " "拼接字符串,依赖JS的隐式类型转换,容易出现不可预期的格式问题,应直接将a初始化为空字符串var a = "" - 弃用警告处理:按照MongoDB驱动的提示,在MongoClient构造参数中传入
{ useUnifiedTopology: true }即可消除旧版监控引擎的弃用警告
修正后的可运行代码
var a = ""; const MongoClient = require('mongodb').MongoClient; const url = "mongodb://localhost:27017/"; // 配置消除弃用警告 const clientOptions = { useUnifiedTopology: true }; const dbName = 'numbzzz'; let dbInstance; // 复用已有连接的写入函数 async function add(item, lastnum) { return await dbInstance.collection('nunb').insertOne({ num: item, LNUM: lastnum }); } // 主流程用立即执行异步函数包裹 (async () => { const client = new MongoClient(url, clientOptions); try { // 全局只建立一次MongoDB连接 await client.connect(); dbInstance = client.db(dbName); console.log("MongoDB连接成功,开始写入数据"); for (var i = 0; i <= 9999; i++) { console.log("当前处理序号:", i); a += i + " "; // 等待写入完成再执行下一轮循环,避免并发过载 await add(a, i); } console.log("所有数据写入完成"); } catch (err) { console.error("程序运行异常:", err); } finally { // 所有操作完成后统一关闭连接 await client.close(); } })();
内容的提问来源于stack exchange,提问作者ghdjhgxc
相关产品推荐
相关产品推荐

