首页 > 解决方案 > NodeJS MonogoDB Postman Post 请求引发错误,可能是 objectID 错误

问题描述

嗨,我正在学习 node js 很长一段时间,但面临一个错误,在花了很多时间后我自己很难为自己修复它,原因是我可能以错误的方式传递 ObjectID,尽管我的端点工作正常我无法在 POSTMAN 中调用 post-call。这是 Json 的一些片段 POSTMAN Post 请求

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

}

终端错误

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`);})

在路线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; 

电影图式模型

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;

标签: javascriptnode.jsmongoosebackend

解决方案


所以在花了 2 天后终于找出错误原因非常简单,我没有在我的 index.js 文件中将 express.json() 传递给传入的请求对象作为 JSON 对象。这就是为什么它抛出错误原因无法正确处理。

以前的代码

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`);})

更新代码

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`);
      })

推荐阅读