How to Create a Blog Post API and Implement in a MERN Stack App

How to Build Create a Blog Post API in a MERN Stack App

Here are the steps –

1. Create a route “post.route.js”-

import express from ‘express’
import {verifyToken} from ‘../utils/verifyUser.js’
import { create } from ‘../controllers/post.controller.js’;

const router=express.Router();

router.post(‘/create’, verifyToken, create)

export default router;

2. Add route in index.js –
app.use(‘/api/post’, postRoute);
3. Create a “post.controller.js” –
import Post from “../models/post.model.js”;
import { errorHandler } from “../utils/error.js”

 

export const create=async(req, res, next)=>{

    console.log(req.user)
    if(!req.user.isAdmin){
      return next(errorHandler(403, ‘You are not allowed to create a post’))
    }
    if(!req.body.title || !req.body.content){
        return next(errorHandler(400, ‘Please provide all required fields’))
    }
    const slug=req.body.title.split(‘ ‘).join(‘-‘).toLowerCase().replace(/[^a-zA-Z0-9-]/g, );
    const newPost= new Post({
        …req.body, slug, userId:req.user.id
    })

 

    try {
        const savedPost=await newPost.save();
        res.status(201).json(savedPost)
    } catch (error) {
        next(error)
    }
}
4. Create a “post.model.js” –
import mongoose from “mongoose”;
const postSchema=new mongoose.Schema(
    {
        userId:{
            type:String,
            required:true
        },
        content:{
            type:String,
            required:true
        },
        title:{
            type:String,
            required:true,
            unique:true
        },
        image:{
            type:String,
            default:‘https://www.hostinger.com/tutorials/wp-content/uploads/sites/2/2021/09/how-to-write-a-blog-post.webp’
        },
        category:{
            type:String,
            default:‘uncategorized’
        },
        slug:{
            type:String,
            required:true,
            unique:true
        }
    }, {timestamps:true}
)
const Post=mongoose.model(‘Post’, postSchema)
export default Post;
Video Tutorial: –

Create a Blog Post API Implementation in React JS – 

1. Adss onChange in title – 

<TextInput type=‘text’ placeholder=‘Title’ required id=‘title’ className=‘flex-1’
onChange={(e)=>setFormData({…formData, title:e.target.value})}/>

 

 
2.  Add onChange in select – 

                <Select onChange={(e)=>setFormData({…formData, category:e.target.value})}>
                    <option value=‘uncategorized’>Select a Category</option>
                    <option value=‘javascript’>Java Script</option>
                    <option value=‘reactjs’>React JS</option>
                    <option value=‘nextjs’>Next JS</option>
                </Select>
 3. Add onChange in ReactQuill-
<ReactQuill theme=‘snow’ placeholder=‘Write Something…’ className=‘h-72 mb-12’ required
onChange={(value)=>setFormData({…formData, content:value})}/>
5. Add onSubmit in form –
<form className=‘flex flex-col gap-4’ onSubmit={handleSubmit}>

6. Create handleSubmit method –

const handleSubmit=async(e)=>{
        e.preventDefault();
        try {
            const res=await fetch(‘/api/post/create’, {
                method:‘POST’,
                headers:{
                    ‘Content-Type’:‘application/json’
                },
                body:JSON.stringify(formData)
            });
            const data=await res.json();
            if(!res.ok){
                setPublishError(data.message);
                return
            }
            if(res.ok){
                setPublishError(null)
                navigate(`/post/${data.slug}`)
            }
        } catch (error) {
            setPublishError(‘Something went wrong’)
        }

 

    }
8. Add PublishError state –
const [publishError, setPublishError]=useState(null)

9. Add Alert if error occurs –

{
                publishError && <Alert className=‘mt-5’ color=‘failure’>{publishError}</Alert>
            }
10. Import useNavigate –

import {useNavigate} from ‘react-router-dom’
11. Define navigate –
const navigate=useNavigate();


 Video Tutorial: –