How To Use Joi for Node API Schema Validation ?

How To Use Joi for Node API Schema Validation ?

Validating without using any package

app.post("/api/courses", (req, res) => {
  if (!req.body.name || req.body.name.length < 3) {
    res.status(400).send("Name is required and should...");
    return;
  }

  const course = {
    id: courses.length + 1,
    name: req.body.name,
  };
  courses.push(course);
  res.send(course);

});

To install joi (Input Validation)

npm i joi

Screenshot (38).png

First Meth

//samayneha Joi bi ahref awal kbir li2ana btarje3 class.
const Joi = require("joi");
const express = require("express");
const app = express();

app.use(express.json());

const courses = [
  { id: 1, name: "course1" },
  { id: 2, name: "course2" },
  { id: 3, name: "course3" },
];

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

app.post("/api/courses", (req, res) => {
  const schema = Joi.object({
    name: Joi.string().min(3).required(),
  });

  const r = schema.validate({ name: "new course" });
  console.log(r);

  if (r.error) {
    res.status(400).send(r.error.details[0].message);
    return;
  }

  const course = {
    id: courses.length + 1,
    name: req.body.name,
  };
  courses.push(course);
  res.send(course);
});
//PORT
const port = process.env.PORT || 3000;

app.listen(port, () => {
  console.log(`Listening on port ${port}....`);
});

Second Meth

//samayneha Joi bi ahref awal kbir li2ana btarje3 class.
const Joi = require("joi");
const express = require("express");
const app = express();

app.use(express.json());

const courses = [
  { id: 1, name: "course1" },
  { id: 2, name: "course2" },
  { id: 3, name: "course3" },
];

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

app.post("/api/courses", (req, res) => {
  const schema = {
    name: Joi.string().min(3).required(),
  };

  const result = Joi.validate(req.body, schema);

  if (result.error) {
    //400 Bad request
    res.status(400).send(result.error.details[0].message);
    return;
  }

  const course = {
    id: courses.length + 1,
    name: req.body.name,
  };
  courses.push(course);
  res.send(course);
});

//PORT
const port = process.env.PORT || 3000;

app.listen(port, () => {
  console.log(`Listening on port ${port}....`);
});

Result without errors

//console.log(result);

{
  error: null,
  value: { name: 'new course' },
  then: [Function: then],
  catch: [Function: catch]
}

Result with errors

//console.log(result);
{
  error: Error [ValidationError]: child "name" fails because ["name" is required]
      at Object.exports.process (C:\Users\10User\Documents\BuildingRESTfulAPIsUsingExpress\express-demo\node_modules\joi\lib\errors.js:196:19)
      at internals.Object._validateWithOptions (C:\Users\10User\Documents\BuildingRESTfulAPIsUsingExpress\express-demo\node_modules\joi\lib\types\any\index.js:668:31) 
      at internals.Object.validate (C:\Users\10User\Documents\BuildingRESTfulAPIsUsingExpress\express-demo\node_modules\joi\lib\types\any\index.js:702:21)
      at C:\Users\10User\Documents\BuildingRESTfulAPIsUsingExpress\express-demo\index.js:23:20
      at Layer.handle [as handle_request] (C:\Users\10User\Documents\BuildingRESTfulAPIsUsingExpress\express-demo\node_modules\express\lib\router\layer.js:95:5)       
      at next (C:\Users\10User\Documents\BuildingRESTfulAPIsUsingExpress\express-demo\node_modules\express\lib\router\route.js:144:13)
      at Route.dispatch (C:\Users\10User\Documents\BuildingRESTfulAPIsUsingExpress\express-demo\node_modules\express\lib\router\route.js:114:3)
      at Layer.handle [as handle_request] (C:\Users\10User\Documents\BuildingRESTfulAPIsUsingExpress\express-demo\node_modules\express\lib\router\layer.js:95:5)       
      at C:\Users\10User\Documents\BuildingRESTfulAPIsUsingExpress\express-demo\node_modules\express\lib\router\index.js:284:15
      at Function.process_params (C:\Users\10User\Documents\BuildingRESTfulAPIsUsingExpress\express-demo\node_modules\express\lib\router\index.js:346:12) {
    isJoi: true,
    details: [ [Object] ],
    _object: { name: 'new course' },
    annotate: [Function (anonymous)]
  },
  value: { username: 'new course' },
  then: [Function: then],
  catch: [Function: catch]
}