简体   繁体   中英

NodeJS MonogoDB Postman Post Request throwing an Error probably the objectID Error

hi there I am learning node js quite a while but facing an error which becomes to really hard to fix it for my own self after spending to much time I got the cause of which is I may be passing ObjectID in a wrong manner although my endpoint is working ok I can't call post-call in POSTMAN. here are some snippets POSTMAN Post request by Json

{   
"genreId":"5f65c490db297fa17cd4f060",
"title": "Trminator",
"numberInStock": 0,
"dailyRentalRate": 0

}

ERROR in terminal

UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'genreId' of undefined at C:\\Users\\Sharjeel MK\\Desktop\\Project- Build the Genres API\\routes\\movies.js:16:47

index.js

const express = require ('express');
const app=express();
const home=require('./routes/home');
const genres=require('./routes/genres');
const customers=require('./routes/customers');
const movies = require('./routes/movies')
 const mongoose=require('mongoose');


mongoose.connect('mongodb://localhost/vidly',{
keepAlive: true,
useNewUrlParser: true,
useCreateIndex: true,
useFindAndModify: false,
useUnifiedTopology: true
})
 .then(()=>console.log("connected")).
  catch((e)=>console.log('not connnected',e));

 app.use('/',home);
 app.use('/vidly.com/api/genres',genres);
 app.use('/vidly.com/api/customers',customers);
 app.use('/vidly.com/api/movies',movies);

const port=process.env.PORT||3000;
app.listen(port,()=>{
console.log(`${port} listening`);})

in routes movie.js

const {Movie, validate} = require('../model/movieModel'); 
const {Genre} = require('../model/genreModel');
const mongoose = require('mongoose');
const express = require('express');
const routes = express.Router();

 routes.get('/', async (req, res) => {
 const movies = await Movie.find().sort('name');
 res.send(movies);
 });

 routes.post('/', async (req, res) => {
 const { error } = validate(req.body); 
 if (error) return res.status(400).send(error.details[0].message);

 const genre = await Genre.findById(req.body.genreId);
 if (!genre) return res.status(400).send('Invalid genre.');

 let movie = new Movie({ 
 title: req.body.title,
 genre: {
   _id: genre._id,
   name: genre.name
 },
  numberInStock: req.body.numberInStock,
  dailyRentalRate: req.body.dailyRentalRate
    });
 movie = await movie.save();

res.send(movie);
 });

 routes.put('/:id', async (req, res) => {
 const { error } = validate(req.body); 
 if (error) return res.status(400).send(error.details[0].message);

 const genre = await Genre.findById(req.body.genreId);
 if (!genre) return res.status(400).send('Invalid genre.');

  const movie = await Movie.findByIdAndUpdate(req.params.id,
   { 
    title: req.body.title,
     genre: {
      _id: genre._id,
       name: genre.name
       },
        numberInStock: req.body.numberInStock,
         dailyRentalRate: req.body.dailyRentalRate
           }, { new: true });

         if (!movie) return res.status(404).send('The movie with the given ID was not found.');

            res.send(movie);
              });

        routes.delete('/:id', async (req, res) => {
        const movie = await Movie.findByIdAndRemove(req.params.id);

        if (!movie) return res.status(404).send('The movie with the given ID was not found.');

        res.send(movie);
        });

        routes.get('/:id', async (req, res) => {
        const movie = await Movie.findById(req.params.id);

        if (!movie) return res.status(404).send('The movie with the given ID was not found.');

        res.send(movie);
        });

        module.exports = routes; 

schema model of movies

const Joi = require('joi');
const mongoose = require('mongoose');
const {genreSchema} = require('./genreModel');

 const Movie = mongoose.model('Movies', new mongoose.Schema({
   title: {
   type: String,
   required: true,
   trim: true, 
   minlength: 5,
   maxlength: 255
   },
    genre: { 
    type: genreSchema,  
    required: true
    },
    numberInStock: { 
    type: Number, 
    required: true,
    min: 0,
    max: 255
    },
    dailyRentalRate: { 
    type: Number, 
    required: true,
    min: 0,
    max: 255
    }
     }));

       function validateMovie(movie) {
        const schema = {
          title: Joi.string().min(5).max(50).required(),
          genreId: Joi.string().required(),
         numberInStock: Joi.number().min(0).required(),
          dailyRentalRate: Joi.number().min(0).required()
          };

         return Joi.validate(movie, schema);
         }

         exports.Movie = Movie; 
        exports.validate = validateMovie;

User findOne -> here is the syntax

var query = {
genreId : req.body.genreId
}
Model-Name.findOne(query, function(err, result){
if(err) throw err
else res.send(200, result)
})

so after spending 2 days finally figure out the error the reason was so much simpler I didn't pass express.json() in my index.js file for incoming Request Object as a JSON Object. that's why it was throwing the error cause not handle properly.

Previous code

const express = require ('express');
const app=express();
const home=require('./routes/home');
const genres=require('./routes/genres');
const customers=require('./routes/customers');
const movies = require('./routes/movies')
const mongoose=require('mongoose');


mongoose.connect('mongodb://localhost/vidly',{
keepAlive: true,
useNewUrlParser: true,
useCreateIndex: true,
useFindAndModify: false,
useUnifiedTopology: true
})
 .then(()=>console.log("connected")).
 catch((e)=>console.log('not connnected',e));

  app.use('/',home);
  app.use('/vidly.com/api/genres',genres);
  app.use('/vidly.com/api/customers',customers);
  app.use('/vidly.com/api/movies',movies);

   const port=process.env.PORT||3000;
   app.listen(port,()=>{
   console.log(`${port} listening`);})

updated code

const express = require ('express');
const app=express();
const home=require('./routes/home');
const genres=require('./routes/genres');
const customers=require('./routes/customers');
const movies = require('./routes/movies')
const mongoose=require('mongoose');


  mongoose.connect('mongodb://localhost/vidly',{
  keepAlive: true,
  useNewUrlParser: true,
  useCreateIndex: true,
  useFindAndModify: false,
  useUnifiedTopology: true
  })
   .then(()=>console.log("connected")).
   catch((e)=>console.log('not connnected',e));

     app.use(express.json());
     app.use('/',home);
     app.use('/vidly.com/api/genres',genres);
     app.use('/vidly.com/api/customers',customers);
     app.use('/vidly.com/api/movies',movies);



      const port=process.env.PORT||3000;
      app.listen(port,()=>{
      console.log(`${port} listening`);
      })

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM