Let's add validation using Joi
to our existing Node.js + Express blog API, specifically for creating articles.
📦 Step 1: Install Joi
npm install joi
📁 Step 2: Create a Middleware File
Create a file: middlewares/validateArticle.js
const Joi = require('joi'); // Define the schema const articleSchema = Joi.object({ title: Joi.string().min(3).max(100).required(), content: Joi.string().min(10).required(), author: Joi.string().min(3).required() }); // Middleware to validate request body function validateArticle(req, res, next) { const { error } = articleSchema.validate(req.body); if (error) { return res.status(400).json({ error: error.details[0].message }); } next(); } module.exports = validateArticle;
🧠 What this does:
-
It checks that:
-
title
is a string between 3–100 chars -
content
is at least 10 chars -
author
is required and at least 3 chars
-
If validation fails, it sends a 400 response with a message like:
"title" is not allowed to be empty
🧪 Step 3: Use the Middleware in the POST Route
In your route file (or server.js
, depending on your structure):
const express = require('express'); const mongoose = require('mongoose'); const cors = require('cors'); const Article = require('./models/article'); const validateArticle = require('./middlewares/validateArticle'); const app = express(); app.use(express.json()); app.use(cors()); // POST with validation middleware app.post('/api/articles', validateArticle, async (req, res) => { try { const newArticle = new Article(req.body); const savedArticle = await newArticle.save(); res.status(201).json(savedArticle); } catch (err) { res.status(500).json({ error: 'Server error while creating article' }); } });
✅ Example of a Valid Request
{ "title": "How to Use Joi", "content": "Joi is a powerful schema description and validation tool...", "author": "Xavier" }
❌ Example of Invalid Request
{ "title": "", "content": "short", "author": "" }
Response:
{ "error": "\"title\" is not allowed to be empty" }
Top comments (0)