无法设置未定义的属性“ imgId”

时间:2018-10-18 08:20:41

标签: node.js mongoose mongoose-schema

我是node.js的新手,正在尝试将用户的照片保存到mongodb中。

这是路由器:

  router.post('/addphoto',  checkAuth, upload.single('image'), (req, res)=> {

   let filename = Math.floor(Math.random() * 100000)
   console.log('imgId is', filename  );

      const photoFields = {};
      photoFields.photos = []
    if(req.file) photoFields.image = req.file.path ;
    photoFields.user = req.user.id; 

    Photo.findOne({ _id: req.user.id }).then(photo => {
          if(photo) {
        //Update

        console.log('photo found! \n\n');
        Photo.findOneAndUpdate(
          {user: req.user.id},
          {$set: photoFields},
          {new: true}
          ).then(photo => res.json(photo));
      } else {
        console.log('No photo found! \n\n');
        //Create
        photoFields.photos[0].imgId =  filename  ;
        photoFields.photos[0].isProfileImg =  true  ;
        photoFields.photos[0].visible = 'all';


        //Save
        new Photo(photoFields).save().then(photo=> {
            res.json(photo);
        }).catch(err => {
              console.log('could not save photo \n\n');
              console.log(err);
        }

      );
  }
    }) 
  });

每个用户都可以上传多张照片,因此这是照片架构,其中照片是对象的数组:

  const PhotoSchema = new Schema({

    user: {
      type: Schema.Types.ObjectId,
      ref: 'users'
    }, 

  photos: [
    {
      imgId: {
        type: Number,
      },
      isProfileImg: {
        type: Boolean,
        default: true,
      },
      visible: {
        type: String,
      }
    }
  ]

});

如您所见,我使用随机函数创建了imgId,并且可以看到它是创建的:

imgId is 65609

但是,我仍然在控制台中收到此错误:

(node:5295) UnhandledPromiseRejectionWarning: TypeError: Cannot set property 'imgId' of undefined

并且没有图像被保存。

我正在使用multer从请求中提取文件,并且可以在控制台中设置正在接收文件。

感谢您提出的解决此错误的建议,该错误使我困扰了几个小时。

1 个答案:

答案 0 :(得分:1)

您将imgId放在一个地方,在没有找到照片的else子句中, 在声明中

photoFields.photos[0].imgId = filename ;

列表photoFields.photos为空,因此第一个元素 photoFields.photos[0]undefined

改为执行类似的操作。

photoFields.photos.push({
    imgId: filename,
    isProfileImg: true,
    visible: 'all',
})