javascript - 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;
解决方案
所以在花了 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`);
})