我正在尝试使用 Multer 和 mongoose 存储图像 data:Buffer

I am trying to store images using Multer and mongoose though data:Buffer

我的架构看起来像这样

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: Cannot set property 'data' of undefined

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

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

修补程序,但不推荐。

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'
      }
    })
  }
}