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

我来总结一下我跟着学习时遇到的问题及解决:

1. bodyParser

  新版本已经没有bodyParser了,很多人留言也提到这个问题。解决的方法是npm install body-parser(注意名字和之前的不一样哦),然后代码中调用也要改变一下,我的如下:

var bodyParser = require('body-parser')
app.use(bodyParser.urlencoded())

2. 『Cannot read property 'movie' of undefined』

  这个问题在解决上一个问题1以后就随之而来,也是困惑了我很长时间。试了各种Google出来的方法,都没用。后来无意中试着改变了(req,res)的位置,居然解决了。具体如下:

  这是跟着作者的视频写的原来的代码:

app.post('/admin/movie/new', function(res, req){
	var id = req.body.movie._id
	var movieObj = req.body.movie
	var _movie

  我改了(req,res)的位置后:

app.post('/admin/movie/new', function(req, res){
	var id = req.body.movie._id
	var movieObj = req.body.movie
	var _movie

 问题就解决了!晕,视频里作者还都说『粗心害死人啊!』


现在又遇到了新的问题,不知道作者能不能看到我的留言给我解答一下。问题就是,例如我提交了一个影片『movie1』,再修改它,不改title(仍然是movie1),改了其它任意字段。点击提交后,在列表页看到了两条记录,名称都是movie1. 而我的理解title是一样的,为什么会变成两条记录。那个『if (id !== 'undefined')』是什么意思呢?


正在回答

9 回答

我的怎么识别不了name="movie[_id]"这个写法啊,然后录入的时候直接报

Cannot read property '_id' of undefined

,

input(type="hidden", name="movie[_id]", value="#{movie._id}")


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

建站一期参考代码:留下github地址 http://www.imooc.com/view/656

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

sonicXXX

地址错了吧
2016-06-14 回复 有任何疑惑可以回复我~

找 can't read movie的错好久了!!!

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

bububang

想问大神这个问题是怎么解决的呢
2016-07-31 回复 有任何疑惑可以回复我~

大家没有遇到一点击“录入”,就报错“cannout read property save of undefined”?

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

小小小木

我刚遇到。。。请问你是怎么解决的呀
2016-05-30 回复 有任何疑惑可以回复我~
#2

sonicXXX 回复 小小小木

解决了吗?
2016-06-14 回复 有任何疑惑可以回复我~

解决了录入电影出现的问题,low_00的问题我也出现了,ths

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

关于bodyParser的设置

var bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({ extended: true }));

调用时需要传入如上参数:extended:true,默认为false,否则在下面的创建Movie中:

app.post('/admin/movie/new', function(res, req){
    var id = req.body.movie._id
    var movieObj = req.body.movie
    var _movie

你仍然是得不到对象和相关的属性的。

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

这贴子真好,顶!

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

再次解释下上面的回答,其中的 后面应该会被拿掉了,是指在二期课程中会被拿掉,不用这样的方式。


一期中代码应该是这样:

// admin post movie
app.post('/admin/movie/new', function(req, res) {
  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)
      }

      _movie = _.extend(movie, movieObj)
      _movie.save(function(err, movie) {
        if (err) {
          console.log(err)
        }

        res.redirect('/movie/' + movie._id)
      })
    })
  }
  else {
    _movie = new Movie({
      doctor: movieObj.doctor,
      title: movieObj.title,
      country: movieObj.country,
      language: movieObj.language,
      year: movieObj.year,
      poster: movieObj.poster,
      summary: movieObj.summary,
      flash: movieObj.flash
    })

    _movie.save(function(err, movie) {
      if (err) {
        console.log(err)
      }

      res.redirect('/movie/' + movie._id)
    })
  }
})

那么这段代码做了两件事:


1. 新生成一个 new movie 实体

2. 更新一个已存在的 new movie 实体


至于是新生成,还是更新,则由 req.body.movie._id 是否存在来判断,如果从后台提交的请求中没有 _id, 也就是 

form.form-horizontal(method="post", action="/admin/movie/new")
        input(type="hidden", name="movie[_id]", value="#{movie._id}")

views 的 admin 中,这个 隐藏域 并没有被赋值,那么 req.body.movie._id 拿到的就是一个 undefined, 通过它存在与否进入到不同的处理逻辑中。

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

whuiscool 提问者

谢谢解答
2014-10-02 回复 有任何疑惑可以回复我~
#2

wsw12345

环境: win7 64bit id !== 'undefined' 不work,改成id !== null 之后可以保存第一条数据。
2015-05-12 回复 有任何疑惑可以回复我~
var MovieSchema = new Schema({
  doctor: String,
  title: String,
  language: String,
  country: String,
  summary: String,
  flash: String,
  poster: String,
  year: Number,
  pv: {
    type: Number,
    default: 0
  },
  category: {
    type: ObjectId,
    ref: 'Category'
  },
  meta: {
    createAt: {
      type: Date,
      default: Date.now()
    },
    updateAt: {
      type: Date,
      default: Date.now()
    }
  }
})

Title 并不是 unique 的,所以,在后台编辑页面多次提交会形成多条数据,而每条数据的 _id 是 unique 的,因此后台还有一个 edit 功能是针对每一条数据进行更新,这个更新不会重复生成数据。


if (id !== 'undefined') 在后面应该会被拿掉了,这里是判断这条数据是否还存在。


最后,由于自己的粗心,给大家带来的不便,向大家致歉。

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

举报

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

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

进入课程
意见反馈 帮助中心 APP下载
官方微信