message: path is required

10,736

Solution 1

He bro.. Check this image.. I was also facing same problem.. and here is what I was doing wrong.enter image description here

Solution 2

I believe your problem might be that body-parser is not configured.

Try npm installing body-parser, then import it at the top of your main server file:

bodyParser = require('body-parser');

Finally, configure it for use. This will allow you to use x-www-form-urlencoded:

// Setting up basic middleware for all Express requests
app.use(bodyParser.urlencoded({ extended: false })); // Parses urlencoded bodies
app.use(bodyParser.json()); // Send JSON responses

Solution 3

Check your 

    req.body.author,
    req.body.rating,
    req.body.reviewText


They must be coming as empty string 
Share:
10,736

Related videos on Youtube

AtomicNation
Author by

AtomicNation

Updated on June 15, 2022

Comments

  • AtomicNation
    AtomicNation almost 2 years

    Hi I'm trying to create a new subdocument via mongoose, but i'm getting the following messages when I execute the POST method in Postman:

    {
      "message": "Location validation failed",
      "name": "ValidationError",
      "errors": {
        "reviews.1.reviewText": {
          "message": "Path `reviewText` is required.",
          "name": "ValidatorError",
          "properties": {
            "type": "required",
            "message": "Path `{PATH}` is required.",
            "path": "reviewText"
          },
          "kind": "required",
          "path": "reviewText"
        },
        "reviews.1.rating": {
          "message": "Path `rating` is required.",
          "name": "ValidatorError",
          "properties": {
            "type": "required",
            "message": "Path `{PATH}` is required.",
            "path": "rating"
          },
          "kind": "required",
          "path": "rating"
        },
        "reviews.1.author": {
          "message": "Path `author` is required.",
          "name": "ValidatorError",
          "properties": {
            "type": "required",
            "message": "Path `{PATH}` is required.",
            "path": "author"
          },
          "kind": "required",
          "path": "author"
        }
      }
    }
    

    Here is my DB Schema for Locations:

    var mongoose = require('mongoose');
    
    var reviewSchema = new mongoose.Schema({
        author: {type: String, required: true},
        rating: {type: Number, required: true, min: 0, max: 5},
        reviewText: {type: String, required: true},
        createdOn: {type: Date, "default": Date.now}
    });
    
    var openingTimeSchema = new mongoose.Schema({
        days: {type: String, required: true},
        opening: String,
        closing: String,
        closed: {type: Boolean, required: true}
    });
    
    var locationSchema = new mongoose.Schema({
        name: {type: String, required: true},
        address: String,
        rating: {type: Number, "default":0, min: 0,  max: 5},
        facilities: [String],
        coords: {type: [Number], index:'2ndsphere'},
        openingTimes: [openingTimeSchema],
        reviews: [reviewSchema]
    });
    
    mongoose.model('Location', locationSchema);
    

    Here the controller launched under router.post('/locations/:locationid/reviews', ctrlReviews.reviewsCreate); routing:

    //reviews.js
    var mongoose = require('mongoose');
    var Loc = mongoose.model('Location');
    
    module.exports.reviewsCreate = function (req, res) {
        var locationid = req.params.locationid;
        if(locationid){
            Loc
                .findById(locationid)
                .select('reviews')
                .exec(
                    function(err, location){
                        if(err){
                            sendJsonResponse(res, 400, err);
                        } else{
                            console.log(location);
                            doAddReview(req, res, location);
                        }
                    }
                );
        } else{
            sendJsonResponse(res, 400, {
                "message" : "Not found, locationid required"
            });
        }
    };
    // START - Functions for review create  //////////////////////////////////////
    var doAddReview = function(req, res, location){
        if(!location){
            sendJsonResponse(res, 404, "locationid not found");
        } else{
            location.reviews.push({
                author: req.body.author,
                rating: req.body.rating,
                reviewText: req.body.reviewText
            });
    
            location.save(function(err, location){
                var thisReview;
                if(err){
                    //sendJsonResponse(res, 400, err);
                    sendJsonResponse(res, 400, err);
                } else{
                    updateAverageRating(location._id);
                    thisReview = location.reviews[location.reviews.length - 1];
                    sendJsonResponse(res, 201, thisReview);
                }
            }); 
        }
    };
    
    var updateAverageRating = function(locationid){
        console.log("Update rating average for", locationid);
        Loc
            .findById(locationid)
            .select('reviews')
            .exec(
                function(err, location){
                    if(!err){
                        doSetAverageRating(location);
                    }
                }
            );
    };
    
    var doSetAverageRating = function(location){
        var i, reviewCount, ratingAverage, ratingTotal;
        if(location.reviews && location.reviews.length > 0){
            reviewCount = location.reviews.length;
            ratingTotal = 0;
            for(i=0; i<reviewCount; i++){
                ratingTotal = ratingTotal + location.reviews[i].rating;
            }
            ratingAverage = parseInt(ratingTotal / reviewCount, 10);
            location.rating = ratingAverage;
            location.save(function(err){
                if(err){
                    console.log(err);
                } else{
                    console.log("Average rating updated to", ratingAverage);
                }
            });
        }
    };
    

    I've seen that error pops when the location.save function is executed. I'm learning MEAN Stack from a book, so you'll be able to download the complete code for this chapter here: https://github.com/simonholmes/getting-MEAN/tree/chapter-06

    I've tried replacing the code of my locations.js and reviews.js files from app_api/controllers folder, but at this point the application crashes, I guess because other files needs to be updated so. So I'm stuck there.

    Does anyone understand why it would be happening?

    Thanks in advance!

  • David Meents
    David Meents almost 8 years
    Had a similar problem a bit ago happen to me and something along this was what solved it.
  • AtomicNation
    AtomicNation almost 8 years
    Joshua I have it configured this way already, but I do not discard that the issue comes from some parse error, as each time I install a module I'm facing several warnings like this: "npm WARN EJSONPARSE Failed to parse json", maybe this is something related, but I couldn't find any solution for this (cache clear doesn't solve).
  • Hashmatullah Noorzai
    Hashmatullah Noorzai over 2 years
    You are a life saver man