You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,导致连接请求被拒绝。
  • 解决办法:
    1. 修改连接URI:将config/default.json中的mongodb://localhost:27017/challenge_v1_db替换为mongodb://127.0.0.1:27017/challenge_v1_db,强制使用IPv4地址连接。
    2. 配置MongoDB监听双协议:修改MongoDB配置文件(如mongod.conf),添加net.ipv6: true并设置net.bindIp: 127.0.0.1,::1,让服务同时监听IPv4和IPv6地址,重启后生效。
    3. 临时调整Node.js解析优先级:启动服务器时添加环境变量,命令示例:NODE_OPTIONS=--dns-result-order=ipv4first npm start,强制Node.js优先解析IPv4地址。

内容的提问来源于stack exchange,提问作者Ignacio García

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 17:07:45