Multer upload.fields无法将图片路径存入MongoDB数组问题
问题描述
多次尝试将图片路径存入MongoDB数组,图片已成功上传到dist目录,但数据库里始终没有对应的数组数据。采用MVC架构,需上传两个图片字段:分类图标(icon)和分类横幅(banner)。
Model 文件
const mongoose = require("mongoose"); const categorySchema = new mongoose.Schema({ name: String, camission: String, icon: Array, banner: Array, mtitel: String, mdiscp: String }); module.exports = mongoose.model("category", categorySchema);
Route 文件
const express = require("express"); const category_route = express(); const bodyParser = require('body-parser'); category_route.use(bodyParser.json()); category_route.use(bodyParser.urlencoded({extended:true})); const controller = require('../Controller/Category'); const Path = require('path'); const multer = require("multer"); category_route.use(express.static('public')); const storage = multer.diskStorage({ destination : function(req, file, cb){ cb(null, Path.join(__dirname,'../public/category'), function(err, success){ if(err){ throw err; } }); }, filename:function(req, file, cb){ const name = Date.now()+'-'+ file.originalname; cb(null, name, function(err, success){ if(err){ throw err; } }); } }); const upload = multer({storage:storage}) category_route.post('/add-category', upload.fields([ { name: "icon", maxCount: 1, }, { name: "banner", maxCount: 1, } ]), controller.addCategory); module.exports = category_route;
Controller 文件(原代码)
const Category = require("../Model/Category"); const addCategory = async (req, res) => { try { var arrIcon = []; for(let i=0; i<req.files.length; i++){ arrIcon[i] = req.files[i].filename; } var arrBanner = []; for(let j=0; j<req.files.length; j++){ arrBanner[j] = req.files[j].filename; } const catData = await Category.find(); if (catData.length > 0) { let checking = false; catData.every((i) => { if (i.name.toLowerCase() === req.body.name.toLowerCase()) { checking = true; console.log("FOUND"); return false; } console.log("NOT-FOUND"); return true; }); if (checking === false) { const data = new Category({ name: req.body.name, camission: req.body.camission, icon: arrIcon, banner: arrBanner, mtitel: req.body.mtitel, mdiscp: req.body.mdiscp, }); const result = await data.save(); res.send(result); } else { res.send("Category is Already exieet"); } } else { const data = new Category({ name: req.body.name, camission: req.body.camission, icon: arrIcon, banner: arrBanner, mtitel: req.body.mtitel, mdiscp: req.body.mdiscp, }); const result = await data.save(); res.send(result); } } catch (error) { console.log(error); res.send("somthing Wrong"); } }; module.exports = { addCategory };
问题分析与解决方案
核心问题
使用multer的upload.fields()时,req.files是对象类型,而非数组。对象的键是你在fields中定义的字段名(icon和banner),对应的值是该字段下的文件数组。原代码中遍历req.files.length会得到undefined,导致arrIcon和arrBanner始终为空数组。
修正后的Controller代码
const Category = require("../Model/Category"); const addCategory = async (req, res) => { try { // 从req.files中提取对应字段的文件名数组 const arrIcon = req.files?.icon?.map(file => file.filename) || []; const arrBanner = req.files?.banner?.map(file => file.filename) || []; // 优化分类查重:直接用MongoDB查询,无需遍历所有数据 const existingCategory = await Category.findOne({ name: { $regex: new RegExp(`^${req.body.name}$`, 'i') } }); if (existingCategory) { return res.send("Category already exists"); } const data = new Category({ name: req.body.name, camission: req.body.camission, icon: arrIcon, banner: arrBanner, mtitel: req.body.mtitel, mdiscp: req.body.mdiscp, }); const result = await data.save(); res.send(result); } catch (error) { console.log(error); res.send("Something went wrong"); } }; module.exports = { addCategory };
其他优化点
- 查重逻辑优化:用
findOne配合正则表达式做不区分大小写的查询,比查询所有数据再遍历效率更高,尤其当数据量较大时。 - 语法简化:使用可选链操作符(
?.)和数组map方法替代循环,代码更简洁易读。 - 错误提示修正:修正拼写错误(
exieet→exists,somthing→Something)。
内容的提问来源于stack exchange,提问作者Ahamed Mern
相关产品推荐
相关产品推荐

