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;