CRUD operations in nodeJS, expressJS and mongodb

How to perform CRUD operations in NodeJS, ExpressJS, and MongoDB. Simple NodeJs Crud application using NodeJS and MongoDB. Follow the below steps to create a simple crud app in NodeJS, ExpressJS, and MongoDB.

Prerequisite:

  • Node Must be Install In your Machine.

CRUD is an acronym for Create, Read, Update, and Delete. It is a set of operations we get servers to execute (POST, GET, PUT and DELETE requests respectively). This is what each operation does.

  • Create (post) – Create Something.
  • Read(Get) – Update Something.
  • Update(put) – Update Something.
  • Delete(delete) – Destroy Something.

In the MongoDB database, the following operations are carried out by the following functions for respective tasks.

    Task Function In MongoDB
Create .create()
read .find()
Update .update()
Delete .remove()

Note: Get and Post requests are easily handled in node js but the put and delete are managed by the method-override library. Further, We will See.

Libraries Used

  • Body-parser
  • Ejs
  • Express
  • Express-session
  • Method-override
  • Mongoose
  • Nodemon
  • Passport
  • Passport-local
  • Passport-local-mongoose

Crud operations in nodeJS and MongoDB

Step 1: Start Server and setup

  • Initiate the server
D:\work\Codebun\productKart>npm init
  • Require express and use the app.
  • And use listen to start the server.
var express = require("express"),
    app = express();

app.listen(process.env.PORT || 5000,process.env.IP,function(err){
    if(err){
        console.log(err);
    }else{ 
    console.log("Server Started at 5000");
   }
})

Step 2 Creating A Database and Schema

  • Make a directory named as models and Create a product.js file inside it. Require mongoose in a variable set A schema And Export the Schema.
const mongoose = require("mongoose");

var productSchema = new mongoose.Schema({
    name:String,
    image:String,
    price:Number
})

module.exports = mongoose.model("Product",productSchema);
  • In the app.js file require Mongoose and connect to the database locally. And Requiring the created Schema and other libraries as well.
  •  Set View Engine and use body-parser and method-override so that they can be used.
  • Body-parser is used to require data from forms and currently loaded page.
  • While method-override is used to rewrite the post request to put or delete as we have access to get and post only in embedded JavaScript.
const express = require("express"),
        app = express(),
        bodyParser = require("body-parser"),
        Product = require("./models/product"),
        methodOverride = require("method-override");
        mongoose = require("mongoose");

mongoose.connect("mongodb://localhost/CURD10");
app.set("view engine","ejs");
app.use(bodyParser.urlencoded({ extended:true }));
app.use(methodOverride("_method"));

Step 3: Creating an Index and Edit Page

  • In view, directory creates a file index.ejs which is the index page for this app.
  • Get the HTML set up and get a link to bootstrap(if using) or custom stylesheets.
  • Set the for For adding the new Product in the upper Section and set input fields according to schema like name, image URL, price. (in this case)
  • In the below section of the webpage set a table to display the data that comes from the database.
  • Use the ejs syntax to use forEach loop to loop through each product of the database.
  • Every product adds the button to delete and edit in the loop. So for each iteration, a button to edit and delete is created for the product.
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>CURD Operation</title>
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css">
</head>
<body>
    <section class="add">
        <form action="/add" method="POST">
            <label for="name">Name</label>
            <input type="text" id="name" name="name" placeholder="productName">
            <label for="image">Image</label>
            <input type="text" id="image" name="image" placeholder="Image-URL">
            <label for="price">Price</label>
            <input type="number" id="price" name="price" placeholder="productPrice">
            <input type="submit">
        </form>
    </section>
    <br>
    <br>
    <hr>
    <section class="show">
        <table class="table">
            <tr>
            <th>Name</th>
            <th>image`</th>
            <th>price</th>
        </tr>
        <% products.forEach(function(product){ %>
            <tr> <td> <h4><%= product.name %></h4> </td>    
            <td><img src="<%= product.image %>" alt="" style="width: 100px;height: 100px;"> </td>
            <td><h5><%=product.price%></h5></td>
            <td><a class="btn btn-warning" href="/<%=product._id%>/edit">EDIT </a></td>
            <td><form action="/<%=product._id%>/?_method=DELETE" method="POST"><button class="btn btn-danger">Delete</button></form></td>
            </tr>
        <% }) %>
    </table>
    </section>
    
</body>
</html>
  • Link To edit button brings to the edit-form page to edit any value in the existing products.
  • This form send a put request which is achieved by method-override.
  • This target id with a particular product that is associated with the edit button on that product that id is extracted using params.
<h1>Edit <%=product.name%></h1>
<form action="/<%=product._id%>/edit?_method=PUT" method="POST">
        <label for="name">Name</label>
        <input type="text" id="name" name="product[name]" value="<%=product.name%>">
        <label for="image">Image</label>
        <input type="text" id="image" name="product[image]" value="<%=product.image%>">
        <label for="price">Price</label>
        <input type="number" id="price" name="product[price]" value="<%=product.price%>">
        <input type="submit">
</form>
<a href="/">GOBACK-></a>

Step 4: Creating Routes for CRUD

  • GET route to show the index page and all the products we use Product.find() function to pass it on the index page. (READ)
  • Post route to add the product to the database using Product.create() and render the index page again with a new product. (Create)
  • Get the edit form with a particular id passed and the form render the pre-existing data we can edit it and send a PUT request using method-override again to update the information of product using Product.findByIdAndUpdate() and rendering the index page with newly updated data.
  • Delete route is called when a delete button of that product is clicked. The requests for deleting data using method-override and Data are removed using Product.findByIdAndRemove() and redirected to the index page with the data deleted.
const express = require("express"),
        app = express(),
        bodyParser = require("body-parser"),
        Product = require("./models/product"),
        methodOverride = require("method-override");
        mongoose = require("mongoose");

mongoose.connect("mongodb://localhost/CURD10");
app.set("view engine","ejs");
app.use(bodyParser.urlencoded({ extended:true }));
app.use(methodOverride("_method"));

//Show product and homepage
app.get("/",(req, res)=>{
    Product.find({},(err,products)=>{
        if (err) {console.log(err);
        }else{
            res.render("index",{products: products});
        }
    })
    
})
//add Product
app.post("/add",(req,res)=>{
    var name = req.body.name;
    var image = req.body.image;
    var price = req.body.price;
    var newProduct = {name:name,image:image,price:price};
    Product.create(newProduct,(err,data)=>{
        if(err){
            console.log(err);
        }else {
            console.log(data);
            res.redirect("/");
        }
    })
})

//Get EditForm
app.get("/:id/edit",(req,res)=>{
    Product.findById(req.params.id,function (err, product){
        if(err){
            console.log(err);
            res.redirect("/");
        }else{
            res.render("edit",{product: product});
        }
    })
})

//Edit Put request
app.put("/:id/edit",(req, res)=>{
    Product.findByIdAndUpdate(req.params.id,req.body.product,function(err,updatedata){
        if(err){
            console.log(err);
            res.redirect("/");
        }else{
            res.redirect("/");
        }
    })
})

//Delete the product
app.delete("/:id",(req,res)=>{
    Product.findByIdAndRemove(req.params.id,function (err){
        if(err){
            console.log(err);
            res.redirect("/");
        }else {
            res.redirect("/");
            }
    })
})



app.listen(2000,(err)=>{
    if(err){
        console.log(err);
    }else {
        console.log("Server Started At PORT 2000");
    }
})