29
loading...
This website collects cookies to deliver better user experience
MERN
stack (MongoDB
for database, Express
and Node
for backend, and React
for frontend) to perform CRUD
operations.CRUD
operations using MERN
stack.npm
and install necessary packagesNode
and Express
Todo
create
, read
, update
and delete
documents from the databaseAPI
routes using Insomnia
HTML
, CSS
, JavaScript
.MERN
stack, but it is a good introduction to building a full-stack app with it.VS Code
or any other editorNode.js
Insomnia
or PostmanPrettier
VS code extension to format the codenpm init -y
package.json
if the folder.npm i cors dotenv express mongoose
cors
: allows cross-origin api callsdotenv
: needed to access data from .env
filesexpress
: web application framework for node.jsmongoose
: It is needed to define the database schema and connecting to mongoDB
-D
is used to install the development dependencies.npm i -D nodemon
package.json
folder should look as follows.// package.json
{
"name": "mern-todo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"config": "^3.3.6",
"cors": "^2.8.5",
"dotenv": "^10.0.0",
"express": "^4.17.1",
"mongoose": "^5.13.2"
},
"devDependencies": {
"nodemon": "^2.0.11"
}
}
server.js
file and a .env
. The server.js
file will be the entry point of the server and the .env
file will contain the MONGO_URI
. We also have to make the following changes in the package.json
//package.json
{
"name": "mern-todo",
"version": "1.0.0",
"description": "",
"main": "server.js", //changed
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"config": "^3.3.6",
"cors": "^2.8.5",
"dotenv": "^10.0.0",
"express": "^4.17.1",
"mongoose": "^5.13.2"
},
"devDependencies": {
"nodemon": "^2.0.11"
}
}
config
: Inside the config
folder, create a file named db.js
. This file will contain the required code for connecting to the MongoDB
database.
controllers
: The controllers
folder will contain the files which will have the methods for the end points to communicate with the database.
models
: The models
folder, will contain the files which will define the MongoDB schema
routers
: The routers
folder will contain the files with the endpoints
.
.
├── config
│ └── db.js
├── controllers
│ └── todo.js
├── models
│ └── todo.js
├── node_modules
├── routes
│ └── todo.js
├── .env
├── server.js
├── package-lock.json
└── package.json
"scripts": {
"start":"node server.js",
"dev":"nodemon server.js"
}
package.json
file should look as follows{
"name": "mern-todo",
"version": "1.0.0",
"description": "",
"main": "server.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node server.js", //added
"dev": "nodemon server.js" //added
},
"keywords": [],
"author": "",
"license": "ISC",
"dependencies": {
"config": "^3.3.6",
"cors": "^2.8.5",
"dotenv": "^10.0.0",
"express": "^4.17.1",
"mongoose": "^5.13.2"
},
"devDependencies": {
"nodemon": "^2.0.11"
}
}
express
express()
get
method for the endpoint http://localhost:8000
using app.get()
PORT
to 8000
for our server to runPORT
using app.listen()
.
├── config
│ └── db.js
├── controllers
│ └── todo.js
├── models
│ └── todo.js
├── node_modules
├── routes
│ └── todo.js
├── .env
├── server.js <-- we are here
├── package-lock.json
└── package.json
nodemon
using the following code. Make sure you are running the following command from the project directory.npm run dev
[nodemon] 2.0.11
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node server.js`
server is running on http://localhost:8000
http://localhost:8000
on your browser.mongoDB
collection.allow access from anywhere
. Then Add IP address
//.env
MONGO_URI = mongodb+srv://<username>:<password>@cluster0.owmij.mongodb.net
<username>
and <password>
with your database username and password which you will set in step 9..
├── config
│ └── db.js <-- we are here
├── controllers
│ └── todo.js
├── models
│ └── todo.js
├── node_modules
├── routes
│ └── todo.js
├── .env
├── server.js
├── package-lock.json
└── package.json
db.js
file which is in the config
folder and add the following changes.mongoose
MONGO_URI
from .env
connectDB
methof for connecting to the databaseconnectDB
method to be called in server.js
server.js
file.dotenv
connectDB
method from config/db.js
connectDB
method.server.js
npm run dev
. The terminal should show a message of MongoDB is connected
which we have added in the db.js
under the try block.todo.js
file in the models folder. We will define the database schema in this file..
├── config
│ └── db.js
├── controllers
│ └── todo.js
├── models
│ └── todo.js <-- we are here
├── node_modules
├── routes
│ └── todo.js
├── .env
├── server.js
├── package-lock.json
└── package.json
mongoose
Schema
called TodoSchema
title
and description
title
will be String
and it is a mandatory fielddescription
will be String
and it is not a mandatory field.
├── config
│ └── db.js
├── controllers
│ └── todo.js
├── models
│ └── todo.js
├── node_modules
├── routes
│ └── todo.js <-- we are here
├── .env
├── server.js
├── package-lock.json
└── package.json
CRUD
operationsexpress
router
controllers
GET
method to read
all the todoPOST
method to create
a new todoPUT
method to update
a existing todoDELETE
method to delete
a existing todorouter
controllers
folder.
├── config
│ └── db.js
├── controllers
│ └── todo.js <-- we are here
├── models
│ └── todo.js
├── node_modules
├── routes
│ └── todo.js
├── .env
├── server.js
├── package-lock.json
└── package.json
Todo
model from models/todo
getAllTodo
postCreateTodo
putUpdateTodo
deleteTodo
getAllTodo
: The find()
method will return all the todo in the collection. If the collection is empty then it will return a 404
error.postCreateTodo
: The create()
method will create a todo and return a success message. Otherwise, it will return a 400
error.putUpdateTodo
: The findByIdAndUpdate()
will require two parameters the id
and data
of the todo to be updated. The id
parameter will be extracted from req.params.id
.deleteTodo
: The findByIdAndRemove()
method will require only one parameter that is the id
of the todo..
├── config
│ └── db.js
├── controllers
│ └── todo.js
├── models
│ └── todo.js
├── node_modules
├── routes
│ └── todo.js <-- we are here
├── .env
├── server.js
├── package-lock.json
└── package.json
CRUD
operations.
├── config
│ └── db.js
├── controllers
│ └── todo.js
├── models
│ └── todo.js
├── node_modules
├── routes
│ └── todo.js
├── .env
├── server.js <-- we are here
├── package-lock.json
└── package.json
server.js
file.routes/todo.js
POST
request to http://localhost:8000/api/todo
GET
request to http://localhost:8000/api/todo
collections
PUT
request to http://localhost:8000/api/todo/id
id
has to be taken from the response message of the server.{
"message": "Todo added successfully",
"data": {
"_id": "60ec0f9655f9735a60a2d967",
"title": "test todo",
"description": "test todo",
"__v": 0
}
}
id
. We will get the id
from the _id
from the preview tab. We can get the id
from the preview
after using the GET
request and POST
request.DELETE
request to http://localhost:8000/api/todo/id
.
├── config
│ └── db.js
├── controllers
│ └── todo.js
├── models
│ └── todo.js
├── node_modules
├── routes
│ └── todo.js
├── .env
├── server.js <-- we are here
├── package-lock.json
└── package.json
cors
so that we can make the api calls from the frontend application like react.