You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 }; 

其他优化点

  1. 查重逻辑优化:用findOne配合正则表达式做不区分大小写的查询,比查询所有数据再遍历效率更高,尤其当数据量较大时。
  2. 语法简化:使用可选链操作符(?.)和数组map方法替代循环,代码更简洁易读。
  3. 错误提示修正:修正拼写错误(exieet→exists,somthing→Something)。

内容的提问来源于stack exchange,提问作者Ahamed Mern

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 12:01:20