Node/Express服务器连接MongoDB出现ECONNREFUSED错误求助
问题
本地运行Node/Express + MongoDB服务器时出现连接拒绝错误。已按官方文档安装MongoDB和Mongosh,mongod服务正常监听127.0.0.1:27017,mongosh也能成功连接该地址,但执行npm start启动服务器时,报错:
Listening on port 4000
Caught exception: {"message":"connect ECONNREFUSED ::1:27017",...}
确认MongoDB服务和客户端均在运行,附上相关配置及代码寻求帮助。
补充代码
config/default.json
{"apiVersion":"v1.1","entorno":"default","mongodb":{"uri":"mongodb://localhost:27017/challenge_v1_db"},"apiKeys":{"localhost":"35cfafab8ef7cfcb2a9bc4e8e4303f59"}}
fakeData.js
import Products from '@/models/Products.model'; import Deliveries from '@/models/Deliveries.model'; import faker from 'faker'; const productsQuantity = 2000; const deliveriesQuantity = 100000; const buildProducts = async () => { let total = await Products.countDocuments(); if (total > productsQuantity) { console.log('fake Products data ready'); return; } let data = []; for (let i = 0; i < productsQuantity; i++) { let fakeData = { reference: faker.commerce.productName(), description: faker.commerce.productDescription(), weight: faker.datatype.number(), height: faker.datatype.number(), }; data.push(Products.create(fakeData)) }; await Promise.all(data); } const buildDeliveries = async () => { let total = await Deliveries.countDocuments(); if (total > deliveriesQuantity) { console.log('fake Deliveries data ready'); return; } let data = []; for (let i = 0; i < deliveriesQuantity; i++) { let random = faker.datatype.number(); let productsFromDb = await Products.find().limit(random > 6 ? 6 : random); let products = []; for (let product of productsFromDb) { products.push(product._id); } let fakeData = { when: faker.date.soon(), origin: { street: faker.address.streetName(), number: faker.datatype.number(), postalCode: faker.address.zipCode(), city: faker.address.city(), }, destination: { street: faker.address.streetName(), number: faker.datatype.number(), postalCode: faker.address.zipCode(), city: faker.address.city(), }, products, }; data.push(Deliveries.create(fakeData)) }; await Promise.all(data); } export default { buildProducts, buildDeliveries }
app.js
import bodyParser from 'body-parser'; import express from 'express'; import cors from 'cors'; import mongoose from 'mongoose'; import config from 'config'; import fakeData from './config/fakeData'; require('mongoose-schema-jsonschema')(mongoose); const app = express(); app.use(cors()); app.use(bodyParser.json({limit: '25mb'})); app.use(bodyParser.urlencoded({ extended: true })); mongoose.Promise = global.Promise; mongoose.connect(config.get('mongodb.uri'), { useNewUrlParser: true, connectTimeoutMS: 2147483647, useUnifiedTopology: true }); mongoose.connection.on('error', (err) => { throw err; }); mongoose.connection.on('connected', async () => { console.log('MongoDB database connected! Environment:', config.get('entorno')); try { await fakeData.buildProducts(); await fakeData.buildDeliveries(); } catch (e) { console.log('MongoDB ensuring indexes FAIL', e); } }); // Routes import router from './components/router/routes'; router.mountRoutes(app); // Handle uncaughtException process.on('uncaughtException', (err) => { console.log('Caught exception: %j', err); }); export default app;
解决方案
- 问题根源:MongoDB服务仅监听IPv4地址
127.0.0.1,但Node.js解析localhost时优先使用IPv6地址::1,导致连接请求被拒绝。 - 解决办法:
- 修改连接URI:将
config/default.json中的mongodb://localhost:27017/challenge_v1_db替换为mongodb://127.0.0.1:27017/challenge_v1_db,强制使用IPv4地址连接。 - 配置MongoDB监听双协议:修改MongoDB配置文件(如
mongod.conf),添加net.ipv6: true并设置net.bindIp: 127.0.0.1,::1,让服务同时监听IPv4和IPv6地址,重启后生效。 - 临时调整Node.js解析优先级:启动服务器时添加环境变量,命令示例:
NODE_OPTIONS=--dns-result-order=ipv4first npm start,强制Node.js优先解析IPv4地址。
- 修改连接URI:将
内容的提问来源于stack exchange,提问作者Ignacio García
相关产品推荐
相关产品推荐

