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

关于 Cannot read property '_id' of undefined 和 _movie.save of undefined 报错问题,个人已解决

第一个问题:Cannot read property '_id' of undefined

分析:

    form表单在提交时采用的是 enctype="multipart/form-data" 二进制编码的方式传递参数,请求体见【图一】
而我在其它项目使用post提交时是【图二】这种 "键":"值" 对数据关系。

5734a9fd00015a4505000337.jpg5734a9fd0001154902780203.jpg

解决:

    所以删除form表单中的二进制编码,在cmd中可以看到获取的_id值(我在/admin/movie 路由中传递了 "_id": "1"的值)


第二个问题:_movie.save of undefined

分析:

        一看到这个报错时,我就去查了nodejs的官方文档,去找save方法,结果是 没写错

        然后就向上找,打印了相关的数据,为

        console.log("这是前台传递的表单数据:" + movieObj);  //req.body.movie 值为 [object object] 正常
        console.log("这是underscore.js中extend()方法执行后movie的值:" + movie);    //值为 undefined 不正常

        这时,问题就出现在

        _.extend(movie, movieObj)

        然后去查找 underscore.js 中 extend方法的解释

       _.extend(destination, *sources)        
  复制source对象中的所有属性覆盖到destination对象上,并且返回 destination 对象.
  复制是按顺序的, 所以后面的对象属性会把前面的对象属性覆盖掉(如果有重复).

        明白了该方法后打印了 通过findById()方法查询数据库出来的movie的值

        console.log("这是从数据库通过id查找出来的数据:" + movie);    //值为 undefined

        http://img1.sycdn.imooc.com//5734aad700015ba504700138.jpg

        这时第二个问题的结揪出来

        在extend()方法中 movie 为 destination,前台传递的参数 movieObj 为 sources。而现在通过查询id获取的 movie= undefined

,所以 _movie的值为undefined,才会出现 _movie.save of undefined。

        那么,在这时就需要去思考 if( id !== "undefined") 这个判定条件是不是出错了!

        因为,我们需要在数据库有该电影字段(通过查询id值)时去更新数据;在没有该电影数据时去完整插入该数据。


 所以这时,我在数据库中手动插入了一条数据

第一步:通过list电影列表页进入该电影修改页面,提交参数。这时,代码的确走了 if 为true时的代码块

第二步:新增一条数据时,提交参数,这时,代码没有走else 下的代码块,而是走了条件为true的 _.extend()的更新数据

原因: if 的判定条件有问题

解决:

    修改 if( id !== 'undefined') 为 if (id != '')

    程序运行正常


  


正在回答

2 回答

问题:再次出现一个错误!电影录入时若 片源地址 中传入的数据不正常,服务器挂载

在电影录入页中,片源地址若传递的参数为空时,数据正常存储到数据库,并跳转到/movie/:id 电影的详情页

若片源地址(movie[flash])传递的参数为非URL格式,数据可以存储到数据库

http://img1.sycdn.imooc.com//57353dd8000126d208210029.jpg

router.get('/movie/:id', function(req, res) {
  var id = req.params.id;
  Movie.findById(id, function(err, movie) {
      console.log("电影id:" + id);
      console.log("电影title:" + movie.title)
    res.render('detail', {
      title: movie.title,
      movie: movie
    });
  })
});

程序执行了一次,即POST下打印出来的2条信息,随后就执行res.render加载detail.jade模板,但是随后又执行了一次

     console.log("电影id:" + id);    //执行的结果实际为 movie[flash]的值!!!!
      console.log("电影title:" + movie.title)    //这时就开始报错,服务器挂载

http://img1.sycdn.imooc.com//57353df60001b2b405230269.jpg

但是此时会进入 detail页,页面渲染数据都正常,但是服务器挂了


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

后期补录一下,不需要更改 判定条件

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

谁说无爱 提问者

(⊙o⊙)…这个就当我没说
2016-05-13 回复 有任何疑惑可以回复我~
#2

songjum

更改判断条件后依旧报错?
2016-11-10 回复 有任何疑惑可以回复我~

举报

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

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

进入课程

关于 Cannot read property '_id' of undefined 和 _movie.save of undefined 报错问题,个人已解决

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