Validation for Schema

 WHILE SENDING PARAMETERS THROUGH HOPPSCOTCH , WE WERE CHECKING IF THE LISTING OBJECT EXISTS OR NOT .

if (!req.body.listing) {
      throw new ExpressError(400, "send valid data!");
    }


BUT WE WEREN'T CHECKING IF A CERTAIN FIELD EXISTS OR NOT. AND WE WERE ABLE TO CREATE A LISTING WITH THOSE MISSING FIELDS.




                                          


IF WE WANT TO OVERCOME THIS PROBLEM WE CAN SOLVE IT BY 

app.post(
  "/listings",
  wrapAsync(async (req, res, next) => {
    if (!req.body.listing) {
      throw new ExpressError(400, "send valid data!");
    }
    const newListing = new Listing(req.body.listing);
    if (!req.body.listing.title) {
      throw new ExpressError(400, "Title missing!");
    }
    if (!req.body.listing.description) {
      throw new ExpressError(400, "Description missing!");
    }if (!req.body.listing.price) {
      throw new ExpressError(400, "Price missing!");
    }if (!req.body.listing.country) {
      throw new ExpressError(400, "Country missing!");
    }
    if (!req.body.listing.location) {
      throw new ExpressError(400, "Location missing!");
    }
    await newListing.save();
    res.redirect("/listings");
  })

HERE FOR EVERY INDIVIDUAL FIELD WE WERE CHECKING IF THEY ARE DEFINED OR NOT. BUT IT BECOMES VERY DIFFICULT WHEN THERE ARE MORE NUMBER OF FIELDS.

HENCE WE USE JOI  

TO INSTALL IT : npm i joi

A SCHEMA.JS IS CREATED AND A SCHEMA IS DESIGNED FOR SERVER SIDE VALIDATION.

SCHEMA.JS

const Joi = require("joi");

module.exports.listingSchema = Joi.object({
  listing: Joi.object({
    title: Joi.string().required(),
    description: Joi.string().required(),
    location: Joi.string().required(),
    country: Joi.string().required(),
    price: Joi.number().required().min(0),
    Image: Joi.string().allow("", null),
  }).required(),
});

IN APP.JS POST REQUEST

const listingSchema = require("./schema.js");

app.post(

  "/listings",
  wrapAsync(async (req, res, next) => {
    let result = listingSchema.validate(req.body);
    console.log(result);
    if (result.error) {
      throw new ExpressError(400, result.error);
    }
    const newListing = new Listing(req.body.listing);

    await newListing.save();
    res.redirect("/listings");
  })


Comments