关于 Cannot read property '_id' of undefined 和 _movie.save of undefined 报错问题,个人已解决
第一个问题:Cannot read property '_id' of undefined
分析:
form表单在提交时采用的是 enctype="multipart/form-data" 二进制编码的方式传递参数,请求体见【图一】
而我在其它项目使用post提交时是【图二】这种 "键":"值" 对数据关系。
解决:
所以删除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
这时第二个问题的症结揪出来了
在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 != '')
程序运行正常