首页 > 解决方案 > 我正在尝试使用 Multer 和猫鼬通过数据存储图像:缓冲区

问题描述

我的架构看起来像这样

const RecipeSchema = mongoose.Schema({
  user: [
    {
      userName: { type: String, required: true },
      userID: { type: String, required: true },
      userPicture: { data: Buffer, type: String, required: true }
    }
  ],
  recipeName: {
    type: String,
    required: true
  },
  created: {
    type: Date,
    required: true
  },
  ingredient: {
    type: String,
    required: true
  },
  rating: {
    type: String
  },
  steps: [
    {
      step: { type: String },
      picture: { type: String }
    }
  ],
  comments: [
    {
      comment: { type: String },
      reply: { type: String }
    }
  ],
  pictures: [
    {
      picture: { data: Buffer, type: String, required: true }
    }
  ]
})

let Recipe = (module.exports = mongoose.model('Recipe', RecipeSchema))

我的 post 方法和 multer 的设置如下所示。

const multer = require('multer')
const storage = multer.diskStorage({
  destination: './route/uploads',
  filename: function(req, file, cb) {
    cb(null, file.fieldname + '-' + Date.now() + path.extname(file.originalname))
  }
})
const upload = multer({
  storage: storage,
  limits: { fileSize: 1000000 },
  fileFilter: function(req, file, cb) {
    checkFileType(file, cb)
  }
})

function checkFileType(file, cb) {
  const filetypes = /jpeg|jpg|png|gif/
  const extname = filetypes.test(path.extname(file.originalname).toLowerCase())
  const mimetype = filetypes.test(file.mimetype)
  if (mimetype && extname) {
    return cb(null, true)
  } else {
    cb('Error: Images Only!')
  }
}

router.post('/', upload.array('files', 10), (req, res) => {
  let files = req.files

  var recipe = new Recipe()
  for (const key in files) {
    if (files.hasOwnProperty(key)) {
      console.log(files[key].path)
      const fl = fs.readFileSync(files[key].path)
      recipe.pictures.picture.data = fl
      recipe.pictures.picture.type = 'image/png' // or 'image/png'
    }
  }
  recipe.save()
})

我收到了这个错误

TypeError:无法设置未定义的属性“数据”

即使保存了图片,当我尝试将路径保存在缓冲区上时,它也不允许我这样做。在猫鼬上,文档现在还不清楚如何启动缓冲区。

标签: javascriptnode.jsmongodbmongoosemulter

解决方案


不要将图像(或文件)保存到数据库,只保存图像名称。

修补程序,但不推荐。

pictures是一个数组。

for (const key in files) {
  if (files.hasOwnProperty(key)) {
    console.log(files[key].path)
    const fl = fs.readFileSync(files[key].path)
    recipe.pictures.push({
      picture: {
        data: fl,
        type: 'image/png'
      }
    })
  }
}

推荐阅读