DEV Community

Cover image for HOW TO BUILD A MEVN APP WITH VITE FRONTEND (PART 1)
Martin Isonguyo
Martin Isonguyo

Posted on

HOW TO BUILD A MEVN APP WITH VITE FRONTEND (PART 1)

Full-stack web development describes the process of building the frontend and backend of a web application. It uses several technologies to accomplish this task; these technologies are collectively referred to as full-stack web development stack. There are several full-stack web development stacks, but we will be discussing the MEVN stack.

This is a three-part tutorial; try to understand each step and have fun while at it. See you on the other side!


WHAT IS MEVN?

MEVN is a full-stack JavaScript web development stack that comprises MongoDB, Express.js, VueJS, and NodeJS. It has grown in popularity in recent times, and it is a highly scalable stack. Its scalability makes it a great choice for developers building small projects and enterprise-level applications.

MongoDB is a document-based database that stores data in a JSON-like format.

Express.js is a lightweight Node.js web application framework. It provides robust features and utilities that make building APIs and routing easy.

Vue.js is a modern progressive frontend JavaScript framework used for building user-friendly interfaces. It is designed to be approachable and easy to integrate for building interactive and dynamic web applications.

Node.js is a server-side JavaScript runtime environment that allows developers to run JavaScript code on the server. It is asynchronous, event-driven, and highly scalable for developing servers and databases.


WHAT IS VITE?

Vite is a build tool and development server that allows for quick and efficient frontend development. It is frequently used with modern frontend frameworks such as Vue.js, React, and Svelte.


BUILDING OUR APPLICATION

We will be building a simple MEVN CRUD app. First, create a project directory and name it mevn-crud. This is where all the magic will be done, and I am rooting for you.


Create server (backend) with Node.js and Express.js.

Inside your project directory, create a folder named server and navigate into it on your terminal.

Initialise npm:

npm init -y
Enter fullscreen mode Exit fullscreen mode

To use ECMAScript modules, add "type": "module" to your generated package.json file. Your package.json should look like this:

{
  "name": "server",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

Enter fullscreen mode Exit fullscreen mode

Install necessary dependencies:

npm i express mongoose body-parser cors dotenv
Enter fullscreen mode Exit fullscreen mode

We will also need nodemon and concurrently for a better development experience. Nodemon reloads the server automatically whenever there is a change in any server file. Concurrently, enable us to run multiple node commands together.

Install nodemon and concurrently as dev dependencies:

npm install --save-dev nodemon concurrently
Enter fullscreen mode Exit fullscreen mode

Update scripts in package.json:

"scripts": {
    "dev:server": "nodemon index.js --ignore ../client/",
    "dev:client": "npm run dev --prefix ../client/",
    "dev": "concurrently \"npm run dev:server\" \"npm run dev:client\""
  },
Enter fullscreen mode Exit fullscreen mode

We need an entry point for our server now that we have finished installing our dependencies and configuring our package.json file.

Create a new file called index.js and add the following code to it:

// index.js
import express from "express";

const app = express();
const PORT = 3000;

app.get("/", (req, res) => {
  res.send("Hello World");
});

app.listen(PORT, () => {
  console.log(`App is running on http://localhost:${PORT}`);
});
Enter fullscreen mode Exit fullscreen mode

Run npm run dev:server in your server folder to start your server, and visit http://localhost:3000/, where you will see Hello, World! displayed.

Kudos! Your server is set.


Setup MongoDB database and connect the server using mongoose

Step 1. Create an account or sign in to MongoDB Atlas.

Step 2. On the Deploy your database page, select the M0 free plan, allow other default settings, and click on the Create button.
Deploy your database page

Step 3. Highlight the Username and Password option if it is not already highlighted. Specify a username and password and click on Create User button. Keep your password safe; you will need it later.
Username and password setup

Step 4. Scroll down and highlight My Local Environment. Input 0.0.0.0/0 under IP address and click on the Add Entry button. This will allow access to your Atlas cluster from anywhere. Click on Finish and Close when you are done and go to overview.
Allow access setting

Step 5. Locate and click on the connect button under your cluster.
Connect cluster

Step 6. On the displayed menu, click on Drivers under Choose Your Application. Copy the Mongo URL, which starts with mongodb+srv.

Step 7. Go back to your application and create a .env file in your server folder and add MONGO_URI and PORT.

MONGO_URI='<mongdb_uri>'
PORT=3000
Enter fullscreen mode Exit fullscreen mode

Ensure that you replace the password in your mongdb_uri with the user password you generated.

Step 8. Replace your index.js code with the following:

// index.js
import express from "express";
import mongoose from "mongoose";
import cors from "cors";
import bodyParser from "body-parser";
import dotenv from "dotenv";

const app = express();
dotenv.config();

app.use(cors()); // to allow cross origin requests
app.use(bodyParser.json()); // to convert the request into JSON
app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/xwww-

// Connect to database
mongoose
  .connect(process.env.MONGO_URI, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
  })
  .then(() => console.log("MongoDB database Connected..."))
  .catch((err) => console.log(err));

app.listen(process.env.PORT, () =>
  console.log(`App is running on http://localhost:${process.env.PORT}`)
);

> 
Enter fullscreen mode Exit fullscreen mode

Run npm run dev:server to check if everything is working fine. MongoDB database Connected... will be printed on your terminal if the server is properly connected to Mongo Atlas.


Create a basic schema with mongoose

Create a models folder inside your server folder and create a Todo.js file inside it. Add the following code to create a schema:

import { Schema, model } from "mongoose";

const TodoSchema = new Schema({
  title: {
    type: String,
    required: true,
  },
  description: {
    type: String,
    required: true,
  },
});

const Todo = model("todo", TodoSchema);

export default Todo;
Enter fullscreen mode Exit fullscreen mode

Create API routes

Create TodoList.js inside /routes/api folder in the server folder. Use the following code to create CRUD API endpoints:

//TodoList.js
import { Router } from "express";
import Todo from "../../models/Todo.js";

const router = Router();

router
  .route("/")

// Get all todos in the database
  .get(async (_req, res) => {
    try {
      const todoList = await Todo.find();
      if (!todoList) throw new Error("No Todo List found");
      res.status(200).json(todoList);
    } catch (error) {
      res.status(500).json({ message: error.message });
    }
  })

  //Post request creates a new todo in the database
  .post(async (req, res) => {
    const newTodo = new Todo(req.body); // create a new instance of the Todo model
    try {
      const todo = await newTodo.save(); // Save created todo
      if (!todo) throw new Error("Something went wrong saving the Todo");
      res.status(200).json(todo);
    } catch (error) {
      res.status(500).json({ message: error.message });
    }
  });

router
  .route("/:id")

  // Update the todo with the given id
  .put(async (req, res) => {
    const { id } = req.params;
    try {
      const updated = await Todo.findByIdAndUpdate(id, { ...req.body });
      if (!updated) throw Error("Something went wrong ");
      res.status(200).json(updated);
    } catch (error) {
      res.status(500).json({ message: error.message });
    }
  })

  // Delete the todo with the given id
  .delete(async (req, res) => {
    const { id } = req.params;
    try {
      const removed = await Todo.findByIdAndDelete(id);
      if (!removed) throw Error("Something went wrong ");
      res.status(200).json(removed);
    } catch (error) {
      res.status(500).json({ message: error.message });
    }
  })

  // Get the todo with the given id
  .get(async (req, res) => {
    const { id } = req.params;
    try {
      const todo = await Todo.findById(id);
      if (!todo) throw new Error("No Todo found");
      res.status(200).json(todo);
    } catch (error) {
      res.status(500).json({ message: error.message });
    }
  });

export default router;

Enter fullscreen mode Exit fullscreen mode

Import the TodoList.js file into the index.js file and create an API route for it. Add the following code to index.js:

// index.js

import TodoListRoutes from "./routes/api/TodoList.js";

---

// Create routes
app.use("/api/todoList", TodoListRoutes);

Enter fullscreen mode Exit fullscreen mode

Use any preferred API testing tool, like Insomnia, to test your API. Ensure all requests (POST, GET, PUT, and DELETE) are working.


Summary

Wow! You've made great strides. You have successfully created a Node.js/Express.js CRUD app with a Mongo Atlas connection. Take a break and return for Part 2, where we will set up our Vue3 client (frontend) to consume our API.

Github Repository: https://github.com/isonguyom/mevn-crud
Live Demo: https://mevn-crud.onrender.com/

If you have any questions or additions, please leave them in the comment section below.

Top comments (0)