Search code examples
javascriptnode.jsmongodbexpress

retrieve data from mongodb with express Js


i have to run the npm command npm install express mongoose cors

then i am running database called studentsRecords with collection student having the following data

db.students.insertMany({id:1},{name:'John'},{id:2,name:'Doe'});

i want to display those data to my web browser with express only as i did on the code bellow , but it display errors (i.e does not fetch any of the given data from database) , how to fix the code so it can work properly?

const express = require('express');
const mongoose = require('mongoose');
const cors = require('cors');

const app = express();
const port = process.env.PORT || 3000;

// Middleware
app.use(cors());
app.use(express.json());

// MongoDB connection
mongoose.connect('mongodb://localhost:27017/mydatabase', {
  useNewUrlParser: true,
  useUnifiedTopology: true
});

// Schema and model
const Schema = mongoose.Schema;
const DataSchema = new Schema({
  name: String
});
const Data = mongoose.model('Data', DataSchema);

// Route to fetch data by name and id
app.get('/data/', async (req, res) => {
  try {
    const { name } = req.params;

    const data = await Data.find({ name: name }, { _id: 0, name: 1 });
    if (!data || data.length === 0) {
      return res.status(404).send('Data not found');
    }
    res.json(data);
  } catch (err) {
    console.error('Failed to fetch data', err);
    res.status(500).send('Internal Server Error');
  }
});

// Start server
app.listen(port, () => {
  console.log(`Server running at http://localhost:${port}/`);
});

Solution

  • Version 2 of the code: A new route path for all is added.

    const express = require('express');
    const mongoose = require('mongoose');
    const cors = require('cors');
    
    const app = express();
    const port = process.env.PORT || 3000;
    
    // Middleware
    app.use(cors());
    app.use(express.json());
    
    // MongoDB connection
    mongoose.connect('mongodb://localhost:27017/test');
    
    // Schema and model
    const Schema = mongoose.Schema;
    const DataSchema = new Schema({
      name: String,
    });
    const Data = mongoose.model('student', DataSchema);
    
    // Route to fetch all
    // IMPORTANT : keep this route path always on top of the other route path '/data/:name'
    // else retrieval will fail.
    app.get('/data/all', async (req, res) => {
      try {
        const data = await Data.find({}, { _id: 0, name: 1 });
    
        if (!data || data.length === 0) {
          return res.status(404).send('Data not found');
        }
        res.json(data);
      } catch (err) {
        console.error('Failed to fetch data', err);
        res.status(500).send('Internal Server Error');
      }
    });
    
    // Route to fetch data by name and id
    app.get('/data/:name', async (req, res) => {
      try {
        const { name } = req.params;
    
        const data = await Data.find({ name: name }, { _id: 0, name: 1 });
    
        if (!data || data.length === 0) {
          return res.status(404).send('Data not found');
        }
        res.json(data);
      } catch (err) {
        console.error('Failed to fetch data', err);
        res.status(500).send('Internal Server Error');
      }
    });
    
    // Start server
    app.listen(port, () => {
      console.log(`Server running at http://localhost:${port}/`);
    });