为了账号安全,请及时绑定邮箱和手机立即绑定

做到最后一步,一直显示Cannot read property '_id' of undefine ?

做到最后一步,一直显示Cannot read property '_id' of undefine ,把req.body输出发现是个空对象,为什么会这样呢?

585364930001ad6603640049.jpg

585364930001d67504560186.jpg


正在回答

5 回答

楼主我遇到和你一样的问题,能分享你的app.js源代码出来看看么

0 回复 有任何疑惑可以回复我~
#1

LovelyDida 提问者

已经分享了,你看楼上
2017-07-19 回复 有任何疑惑可以回复我~

你好 我后台录入消息点击录入按钮的时候,显示404 是怎么回事http://img1.sycdn.imooc.com//585a9eb90001542410130565.jpg

index.js
var express = require('express');
var router = express.Router();
var _ = require('underscore');
var Movie = require('../models/movie.js');

/* GET home page. */
//router.get('/', function(req, res, next) {
//  res.render('index', { title: 'My Videos' });
//});
//detail
router.get('/movie/:id', function (req, res) {
    //通过req,params,id来拿到id参数
    var id = req.params.id;
    //调用模式里面定义的静态方法
    Movie.findById(id, function (err, movie) {
        res.render('detail', {
            title: 'imovie' + movie.title,
            movie: movie
        })
    })
});
//admin-page
router.get('/admin/movie', function (req, res) {
    res.render('admin', {
        title: 'imovie 后台录入页面',
        movie: {
            title: '',
            director: '',
            country: '',
            year: '',
            poster: '',
            flash: '',
            summary: '',
            language: ''
        }
    })
});
//admin updata movie//更新电影
router.get('/admin/update/:id', function (req, res) {
    //拿到这个id
    var id = req.params.id;
    //判断如果id存在
    if (id) {
        Movie.findById(id, function (err, movie) {
            res.render('admin', {
                //传入这个电影
                title: 'imovie 后台更新页',
                movie: movie
            })
        })
    }
});
//admin post movie:拿到从后台录入页post过来的数据
router.post('/admin/movie/new', function (req, res) {
    //判断数据id是新是旧
    var id = req.body.movie._id;
    var movieObj = req.body.movie;
    var _movie;
    //判断是否存在于数据库中
    //如果存在的话
    if (id !== 'undefined') {
        Movie.findById(id, function (err, movie) {
            if (err) {
                console.log(err)
            }
            //用上面post过的新电影数据替换掉老的数据
            //使用underscore模块
            _movie = _.extend(movie, movieObj);
            _movie.save(function (err, movie) {
                if (err) {
                    console.log(err)
                }
                //成功的话跳转到电影详情页
                res.redirect('/movie/' + movie._id)
            })
        })
    }
    //如果没有id的话
    else {
        //调用构造函数,传入电影数据
        _movie = new Movie({
            director: movieObj.director,
            title: movieObj.title,
            country: movieObj.country,
            language: movieObj.language,
            year: movieObj.year,
            poster: movieObj.poster,
            flash: movieObj.flash,
            summary: movieObj.summary
        });
        _movie.save(function (err, movie) {
            if (err) {
                console.log(err)
            }
            //成功的话跳转到电影详情页
            res.redirect('/movie/' + movie._id)
        })
    }
});


//list-page
router.get('/admin/lists', function (req, res, next) {
    //查询一下
    Movie.fetch(function (err, movies) {
        //如果异常,则打印出异常
        if (err) {
            console.log(err)
        }
        //渲染lists模板
        res.render('lists', {
            title: 'imovie 列表页',
            //把查询到的lists列表赋予,movies
            movies: movies
        })
    });
});
//index page
router.get('/', function (req, res) {
    //调用模型.Movie.fetch,直接调用movie数组
    Movie.fetch(function (err, movies) {
        //如果异常,则打印出异常
        if (err) {
            console.log(err)
        }
        //渲染首页模板
        res.render('index', {
            title: 'imovie 首页',
            //把查询到的首页列表赋予,movies
            movies: movies
        })
    });
    //res.render('index', {
    //    title: 'imovie 主页',
    //    movies: [{}]
    //})
});
module.exports = router;


app.js

var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var index = require('./routes/index');
var mongoose = require('mongoose');
var users = require('./routes/users');
//underscore模块
var _ = require('underscore');
var app = express();
mongoose.connect('mongodb://localhost/imovie');
//http.createServer(app).listen(app.get('port'), function(){
//    console.log('Express server listening on port ' + app.get('port'));
//});
app.locals.moment=require('moment');
// view engine setup
//更改视图的默认目录
app.set('views', path.join(__dirname, './views/pages'));
app.set('view engine', 'jade');
//后台录入也有提交表单的步骤,所以可以格式化后台表单数据
app.use(bodyParser.urlencoded({extended: true}));
//设置静态资源(css,js等)从public文件夹中获取
app.use(express.static(path.join(__dirname, 'public')));
// uncomment after placing your favicon in /public
//app.use(favicon(path.join(__dirname, 'public', 'favicon.ico')));

app.use(logger('dev'));
app.use(bodyParser.json());

app.use(cookieParser());


app.use('/', index);
app.use('/users', users);
//app.use('/movie/:id', index);
//app.use('/admin/movie', index);
//app.use('/admin/lists', index);
//app.use('/admin/movie',users);
// catch 404 and forward to error handler
app.use(function (req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

// error handler
app.use(function (err, req, res, next) {
    // set locals, only providing error in development
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};

    // render the error page
    res.status(err.status || 500);
    res.render('error');
});

module.exports = app;


schemas/movie.js

//引入mongoose模块
var mongoose = require('mongoose');
//调用mongoose的schema方法
var MovieSchema = new mongoose.Schema({
    //对数据定义类型
    director: String,
    title: String,
    language: String,
    country: String,
    flash: String,
    poster: String,
    year: Number,
    //更新数据时时间的记录
    meta: {
        createAt: {
            type: Date,
            //默认值:创建时候的时间
            default: Date.now()
        },
        //更新的时间
        updateAt: {
            type: Date,
            default: Date.now()
        }
    }
});
//为这个模式添加一个方法;
//每次存储数据之前都来调用这个方法:pre.save
MovieSchema.pre('save', function (next) {
    //判断数据是否是新加的,如果是的话,那么词条数据的更新时间就等于创建时间
    if (this.isNew) {
        this.meta.createAt = this.meta.updateAt = Date.now()
    }
    else {
        //否则的话,跟新时间就等于现在时间
        this.meta.updateAt = Date.now()
    }
    //用next结尾
    next()
});
//增加一个静态方法
//静态方法不会直接与数据库交互,只有经过model编译并且实例化之后才会有这种方法
MovieSchema.statics = {
    //添加fetch方法,用来取出数据库所有数据,
    fetch: function (cb) {
        return this
            .find({})
            //按照跟新时间排序
            .sort('meta.updateAt')
            //执行这个回掉方法
            .exec(cb)
    },
    //用来查询单条数据
    findById: function (id, cb) {
        return this
            .findOne({"_id": id})
            .exec(cb)
    }
};
//将此模式导出
module.exports = MovieSchema;

models/movie.js

var mongoose = require('mongoose');
//引入Schema模式文件
var MovieSchema = require('../schemas/movie.js');
//编译生成Movie模型,通过调用mongoose.model,传入这个模型的名字(Movie)以及模式(MovieSchema)。
var Movie = mongoose.model('Movie', MovieSchema);
//导出构造函数movie

module.exports = Movie;


0 回复 有任何疑惑可以回复我~
#1

LovelyDida 提问者

scott课程里的jade模板后台录入页里action应该是“/admin/movie/new”
2016-12-22 回复 有任何疑惑可以回复我~
#2

FaSoLa 回复 LovelyDida 提问者

谢谢!解决了!
2016-12-22 回复 有任何疑惑可以回复我~

补充一下:

http://img1.sycdn.imooc.com//5854f1a80001701404740087.jpg

0 回复 有任何疑惑可以回复我~

补充一下:

http://img1.sycdn.imooc.com//5854f1a80001701404740087.jpg

0 回复 有任何疑惑可以回复我~

经过多方研究,我终于知道错在那里了,用express 的 bodyParser post 上传文件,bodyParser对请求的包体进行解析,form默认的提交方式是www-form-urlencoded,所以bodyParser应该这样写  app.use(bodyParser.urlencoded({ extended:true }));

2 回复 有任何疑惑可以回复我~
#1

dawnxuuu

正解。extended:true 一定要是true。 我之前是false一直报错,坑爹啊
2017-06-01 回复 有任何疑惑可以回复我~

举报

0/150
提交
取消
node+mongodb 建站攻略(一期)
  • 参与学习       91860    人
  • 解答问题       889    个

带你完整实现一个从前端到后端的项目,初中级前端开发工程师必学课程

进入课程

做到最后一步,一直显示Cannot read property '_id' of undefine ?

我要回答 关注问题
意见反馈 帮助中心 APP下载
官方微信