Home > front end >  How to GET data from mongoDB ATLAS and display in React App
How to GET data from mongoDB ATLAS and display in React App

Time:04-22

I am new to MERN stack and been working on a project that uses different driver information entered from the user and display that information back to the user in a table. I have successfully connected to MongoDB Atlas and also can enter data using my front end but I can't seem to figure out how to retrieve the data back to the front end. Can y'all help me fetch the data back and how I can present it in a tabular format. Thanks in advance.

//driver model
onst mongoose = require('mongoose');
const DriverSchema = new mongoose.Schema({
    name:{type: String, required:true},
    email:{type: String, required:true},
    phone:{type: Number, required:true},
    address:{type:String, required:true},
    country:{type: String, required:true}
});

const DriverModel = mongoose.model("drivers", DriverSchema)
module.exports = DriverModel;

//routes
const router= require('express').Router();
let Driver = require('../models/driver');

router.route('/getDrivers').get((req, res) =>{
    Driver.find()
    .then(drivers => res.json(drivers))
    .catch(err => res.status(400).json('Error: '  err));

}
)

router.route('/createDrivers').post((req, res) => {
    const name = req.body.name;
    const email = req.body.email;
    const phone = req.body.phone;
    const address = req.body.address;
    const country =req.body.country;
    const newDriver = new Driver({name, email, phone, address, country});
  
    newDriver.save()
      .then(() => res.json('Driver added!'))
      .catch(err => res.status(400).json('Error: '   err));
  });
  
  router.route('/:id').get((req,res)=> {
      Driver.findById(req.params.id)
      .then(drivers => res.json(drivers))
      .catch(err => res.status(400).json('Error: '   err));
  })

  router.route('/:id').delete((req, res) => {
    Driver.findByIdAndDelete(req.params.id)
      .then(() => res.json('Driver deleted.'))
      .catch(err => res.status(400).json('Error: '   err));
  });

  router.route('/update/:id').post((req, res) => {
    Driver.findById(req.params.id)
      .then(driver => {
        driver.name = req.body.name;
        driver.email = req.body.email;
        driver.phone = req.body.phone;
        driver.address = req.body.address;
        driver.country =req.body.country;
  
        driver.save()
          .then(() => res.json('Driver updated!'))
          .catch(err => res.status(400).json('Error: '   err));
      })
      .catch(err => res.status(400).json('Error: '   err));
  });

  module.exports = router; 
//frontend
import React from 'react';
import Sidebar from '../../components/sidebar/Sidebar';
import Navbar from '../../components/navbar/Navbar';
import { useEffect, useState } from 'react';
import "./dbtrial.scss" ;
import Axios from "axios";
function Dbtrial() {
    
    const [listOfDrivers, setListOfDrivers]= useState([]);
    const [name, setName] = useState("");
    const [email, setEmail] = useState("");
    const [phone, setPhone] = useState(0);
    const [address, setAddress] = useState("");
    const [country, setCountry] = useState("");

    useEffect(() => {
      const fetchDrivers= async () =>{
        try{
          const response = await fetch("http://localhost:3001/driver/getDrivers")
          if(!response.ok) throw Error('Did not recieve expected data');
          const listDrivers = await response.json();
          console.log(listDrivers);
          setListOfDrivers(listDrivers);
          setFetchError(null);
        } catch(err){
          setFetchError(err.message)
        }
      }
      setTimeout(() => {
        (async () => await fetchDrivers())();
      }, 2000)
      //(async () => await fetchDrivers())();
    }, [])
        
    const createDrivers = () =>{
      Axios.post("http://localhost:3001/createDrivers", {
        name, 
        email, 
        phone, 
        address,
        country,
      }).then((response) =>{
        setListOfDrivers([...listOfDrivers,
        {
          name, email, phone, address,
          country,
        },
      ]);
        //alert("Driver added!");
      });
    } 
    
    return (
        <div className="db">
            <Sidebar />
            <div className="dbq">
                <Navbar />
                <div className="formInput">
                    <label>Name</label>
                    <input type="text" placeholder="name"  onChange={(event) => {
                      setName(event.target.value);
                      }} />
                </div>
                <div className="formInput">
                    <label>Email</label>
                    <input type="email" placeholder="email"  onChange={(event)=> {setEmail(event.target.value);}}/>
                </div>
                <div className="formInput">
                    <label>Phonenumber</label>
                    <input type="text" placeholder="0923668881 "  onChange={(event) => {setPhone(event.target.value);}}/>
                    </div>
                <div className="formInput">
                    <label>Address</label>
                    <input type="text" placeholder="Addis Ababa" onChange={(event)=> {setAddress(event.target.value);}}/>
                </div>
                <div className="formInput">
                    <label>Country</label>
                    <input type="text" placeholder="country" onChange={(event) => {setCountry(event.target.value);}}/>
                    <button type="submit" onClick={createDrivers}>Send</button>
                </div>
                
            </div>
            
        </div>
    )
}

export default Dbtrial

CodePudding user response:

On your backend, your router functions don't seem to use

res.send

Where you are doing res.json, you can do something like

res.status(200).send(responseData)

So in router.routes.findById' then callback, instead of:

.then(drivers => 
   res.json(drivers))

You can have

.then(drivers => 
   res.status(200).send(JSON.stringify(drivers)) //maybe you don't need to use JSON.stringify here
  

In your frontend, I'm not sure what response.data will be defined after your api call. To be sure what properties the response has, you can console.dir(response.data), console.dir(response.json()) and check the result in the browser console. (Not too familiar with axios) If the result is your driver array, you can do like are already doing with setDriverList to set the state, but probably with the result of, or a part of the result of response.data or response.data.devices or something like that.

So I would do something like

//...api call
.then((response) => {
    if(response.status === 200){
        setDriverList(response.data.drivers) //or response.data or whatever
    }
})
  • Related