2

I'm trying to run a Node/Express server at my localhost that uses MongoDB as a database. I have never used MongoDB before so I installed both MongoDB and Mongosh following mongo documentation.

After installation, I run mongo server (mongod) and mongo client (mongosh) at the default port 27017 without problem.

mongod console message:

...
    {"t":{"$date":"2023-04-13T16:58:08.218-03:00"},"s":"I",  "c":"NETWORK",  "id":23015,   "ctx":"listener","msg":"Listening on","attr":{"address":"127.0.0.1"}}
    {"t":{"$date":"2023-04-13T16:58:08.218-03:00"},"s":"I",  "c":"NETWORK",  "id":23016,   "ctx":"listener","msg":"Waiting for connections","attr":{"port":27017,"ssl":"off"}}
...

mongosh console message:

...
Current Mongosh Log ID: 64385f4e504e549f2d810293
Connecting to:          mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+1.8.0
Using MongoDB:          6.0.5
Using Mongosh:          1.8.0
...

When I try to run the server with npm start it is supposed to create a db at my localhost but I get the following error:

Listening on port 4000
Caught exception: {"message":"connect ECONNREFUSED ::1:27017","reason":{"type":"Single","setName":null,"maxSetVersion":null,"maxElectionId":null,"servers":{},"stale":false,"compatible":true,"compatibilityError":null,"logicalSessionTimeoutMinutes":null,"heartbeatFrequencyMS":10000,"localThresholdMS":15,"commonWireVersion":null}}

I am pretty sure that both the server and client of mongo are already running so I don't know why I'm getting connect ECONNREFUSED error. Any help is welcome

UPDATE 1: Add code

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;
Wahyu Kristianto
  • 8,719
  • 6
  • 43
  • 68

1 Answers1

1

It looks like the issue might be related to the connection using IPv6 (::1) instead of IPv4 (127.0.0.1). Try to change your config:

{
  "apiVersion": "v1.1",
  "entorno": "default",
  "mongodb": {
      "uri": "mongodb://127.0.0.1:27017/challenge_v1_db"
  },
  "apiKeys": {
    "localhost": "35cfafab8ef7cfcb2a9bc4e8e4303f59"
  }
}

Also, you can add an option to mongoose.connect() call in to help debug the issue:

mongoose.connect(config.get('mongodb.uri'), {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  serverSelectionTimeoutMS: 5000,
  socketTimeoutMS: 45000,
  family: 4
});
Wahyu Kristianto
  • 8,719
  • 6
  • 43
  • 68