因此,我的模式中有两个属性。1) ImageCover (单个文件)和2)图像(图像数组)
我正在使用multer的upload.fields方法上传这两个文件。当我上传这两个,它works.But当我尝试上传他们中的任何一个时,我得到的错误是,另一个字段没有定义。我该如何解决这个问题呢?
1) multer.js
module.exports = () => {
let multer = require('multer')
let myStorage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, './uploads/')
},
filename: (req, file, cb) => {
cb(null, `${Date.now()}-${file.originalname}`)
}
})
filter = (req, file, cb) => {
let mimeType = file.mimetype.split('/')[0]
if (mimeType !== 'image') {
req.fileError = true
cb(null, false)
} else {
cb(null, true)
}
}
let upload = multer({
storage: myStorage,
fileFilter: filter
})
return upload
}2)上传照片文件
module.exports = function Check(req) {
if (req.files.images) {
req.body.images = []
let allFiles = req.files.images
allFiles.forEach(file => {
let mimeType = file.mimetype.split('/')[0]
if (mimeType !== 'image') {
fs.unlink(path.join(process.cwd(), 'uploads/'), (err, done) => {
if (err) console.log(err)
})
}
req.body.images.push(file.filename)
})
}
if (req.files.imageCover[0]) {
let file = req.files.imageCover[0]
let mimeType = file.mimetype.split('/')[0]
if (mimeType !== 'image') {
fs.unlink(path.join(process.cwd(), 'uploads/'), (err, done) => {
if (err) console.log(err)
})
}
req.body.imageCover = file.filename
}
}3)创建控制器(check是我在上面导出的函数)
exports.createTour = (req, res, next) => {
check(req)
if (req.fileError) { return next({ error: 'invalid file format dude' }) }
Tour.create({
...req.body,
owner: req.user._id
}).then(result => {
res.status(201).json({
status: 'success',
total: result.length,
result
})
}).catch(err => next(err))
}4)路由处理程序
Router.route('/')
.post(authController.protect,
upload.fields([
{
name: 'imageCover', maxCount: 1,
},
{
name: 'images', maxCount: 10
}
]),
tourController.createTour)发布于 2020-02-17 23:33:02
我认为你得到这个错误是因为你试图访问数组的第一个元素,而数组是空的或者没有定义。
例如:
if (req.files.imageCover[0])尝试重构如下所示:
if (req.files.hasOwnProperty("imageCover") && req.files.imageCover.length > 0)您应该在对象/数组可以是可选的所有位置上执行类似的验证
https://stackoverflow.com/questions/60250486
复制相似问题