How to Create a RESTful API in Node.js using Express, MongoDB
Published: 2020-11-18 11:18:15

###### A brief guide to creating a RESTful API in Node.js using Express, MongoDB

### Step 1: Basic Setup
- Create a Folder name `posts`
- open in vscode or sublime text
- open (terminal/command prompt) then install the (dependencies/packages)
- `npm init -y`
- `npm install express nodemon mongoose dotenv body-parser cors`
- open `package.json` add this script below in code

```sh
"scripts": {
    "start": "nodemon app.js"
  }
```
### Step 2: Setup MongoDB

- [MongoDB Cloud](https://account.mongodb.com/account) or [Database-as-a-Service for MongoD](https://mlab.com/)
- create account (or) login account
- create a cluster like a `posts`
- create a `.env` file in your project root folder
```sh
DB_CONNECTION = mongodb+srv://admin:<password>@cluster0.yarox.mongodb.net/<dbname>?retryWrites=true&w=majority
```
### Step 3: Create Schema
- Create `models` folder and create `posts.js` files
```sh
const mongoose = require("mongoose");
const PostSchema = new mongoose.Schema({
    title:{
        type: String,
        require:true,
        unique: true 
      },
    description:{
        type: String,
        require:true
      },
    date:{
        type: Date,
        default:Date.now
      }
})

module.exports = mongoose.model('Posts',PostSchema);
```
- create `User.js` inside a `models` folder
```sh
const mongoose = require("mongoose");
let userSchema = new mongoose.Schema({
    name:{
        type: String,
        required:true,
        min:6,
        max:255,
      },
      email:{
          type:String,
          required:true,
          unique: true,
          max:255,
          min:6
      },
      password:{
          type:String,
          required:true,
          max:1024,
          min:6
      },
      date:{
        type: Date,
        default:Date.now
      }

})

module.exports = mongoose.model('users',userSchema);
```

### Step 4: Create Routes
- create `routes` folder and create `posts.js` files
```sh
const router = express.Router();
const Post = require('../models/Post')

// get back all the posts
router.get("/",async (req,res)=>{
    try{
const posts = await Post.find();
res.json(posts);
    }catch(err){
res.json({message:err});
    }
})

// submits a post
router.post("/",async (req,res)=>{
    // console.log(req.body)
    const post = new Post({
        title:req.body.title,
        description:req.body.description,
    });
    try{
    const savedPost = await post.save();
    res.json(savedPost);
} catch(err){
    res.json({message:err});
}

})


// specfic Post
router.get('/:postId',async (req,res)=>{
     console.log(req.params.postId)
    try{
        const post = await Post.findById(req.params.postId);
        res.json(post);
    } catch(err){
    res.json({message:err});
}
})


//  Delete Post
router.delete("/:postId",async(req,res)=>{
    console.log(req.params.postId)
    try{
     const removedPost = await Post.remove({_id:req.params.postId});
     res.json(removedPost);
    }catch(err){
        res.json({message:err});
    }
})

//  update a post
router.patch('/:postId',async (req,res)=>{
    try{
    const updatedPost = await Post.updateOne(
        {_id:req.params.postId},
        {$set:{title:req.body.title}}
        );
        res.json(updatedPost);
    }catch(err){
        res.json({message:err});
    }
})

module.exports = router;
```
- create `auth.js` inside a `routes` folder
```sh
const router = require("express").Router();
const User = require('../models/User')

router.post('/register', async (req,res)=>{
    // res.send("register")
    const user = new User({
        name:req.body.name,
        email:req.body.email,
        password:req.body.password
    });
    try{
        const savedUser = await user.save();
        res.status(201).send(savedUser); 
    }catch(err){
        res.status(400).send(err); 
    }
})

module.exports = router;
```
### Step 5: server run 
- create an `app.js` file in your project folder
```sh
const express = require('express');
const app = express();
const PORT = 3000;
const mongoose = require("mongoose")
require('dotenv/config')

// middlewares Routes
const authRoutes = require("./routes/auth")
const postsRoutes = require("./routes/posts")
app.use('/api/user',authRoutes);
app.use('/api/posts',postsRoutes);

// ROUTES
app.get('/',(req,res)=>{
res.send("We are on Home")
})


// connect to DB
mongoose
  .connect(
    process.env.DB_CONNECTION,
    {
      useNewUrlParser: true,
      useUnifiedTopology: true,
      useCreateIndex:true
    }
  ).then(() => console.warn("db Connection"));

// db connection end

// listen
app.listen(PORT, () =>
  console.log(`server address: https://localhost:${PORT}`)
);
```