使用Multer与Cloudinary上传后,MongoDB仅存储ObjectId无其他字段
问题:MongoDB仅存储ObjectId,filePath和imageUrl字段未保存
我编写了一段代码,通过一个字段获取filePath,另一个字段集成Cloudinary获取图片链接,计划使用multer将filePath和图片链接存储至MongoDB。表面上所有流程运行正常,但数据库中始终仅存储ObjectId,其他字段均未保存。
控制器代码
const fileUpload = async (req, res) => { try { const templateEntry = new Template(); if (req.files && req.files.length > 0) { for (const file of req.files) { const fileName = file.filename; console.log("Processing file:", file.fieldname); if (file.fieldname === "imageUrl") { const result = await cloudinary.uploader.upload(file.path); if (!result.secure_url) { console.log("Cloudinary upload failed:", result); } else { console.log("Cloudinary upload successful. URL:", result.secure_url); templateEntry.imageUrl = result.secure_url; } } else if (file.fieldname === "filePath") { const fileEntryPath = path.join( __dirname, "uploads", fileName ); console.log("File path:", fileEntryPath); // Log the file path templateEntry.filePath = fileEntryPath; } } } console.log("Template entry before saving:", templateEntry); // Log the template entry before saving await templateEntry.save(); console.log("Template entry saved successfully"); res.status(200).json({ message: "Template has been saved successfully", }); } catch (error) { console.error("Error:", error); // Log the error for debugging res.status(500).json({ error: error.message }); } };
路由代码
const multer = require("multer"); const path = require("path"); const storage = multer.diskStorage({ destination: "./uploads", filename: (req, file, cb) => { const unique = Date.now() + "-" + Math.round(Math.random() * 1e9); cb(null, unique + "-" + path.extname(file.originalname)); }, }); const upload = multer({ storage }); router.post( "/template-upload", upload.fields([ { name: "filePath", maxCount: 1 }, { name: "imageUrl", maxCount: 1 }, ]), fileUpload );
问题排查与修复方案
修正Multer文件遍历逻辑
使用upload.fields()时,req.files是一个对象而非数组,键为你定义的字段名,对应值是该字段的文件数组。原代码遍历req.files的方式错误,导致无法正确处理文件。修正后的处理逻辑:if (req.files) { // 处理imageUrl字段 if (req.files.imageUrl && req.files.imageUrl.length > 0) { const file = req.files.imageUrl[0]; const result = await cloudinary.uploader.upload(file.path); if (result.secure_url) { templateEntry.imageUrl = result.secure_url; console.log("Cloudinary upload successful. URL:", result.secure_url); } else { console.log("Cloudinary upload failed:", result); } } // 处理filePath字段 if (req.files.filePath && req.files.filePath.length > 0) { const file = req.files.filePath[0]; const fileEntryPath = path.join(__dirname, "uploads", file.filename); templateEntry.filePath = fileEntryPath; console.log("File path:", fileEntryPath); } }验证Template模型定义
确保MongoDB的Template模型中已明确声明imageUrl和filePath字段,类型为String。如果模型中未定义这两个字段,Mongoose会自动忽略未声明的属性,导致无法存入数据库。示例模型:const mongoose = require('mongoose'); const TemplateSchema = new mongoose.Schema({ imageUrl: String, filePath: String }); module.exports = mongoose.model('Template', TemplateSchema);确认字段名一致性
检查前端上传表单的字段name属性,确保和代码中定义的filePath、imageUrl完全一致,大小写也不能出错。核对日志输出
修正后查看Template entry before saving的日志,确认imageUrl和filePath已被正确赋值。如果仍为空,检查文件是否成功上传到服务器,以及Cloudinary的上传流程是否正常。
内容的提问来源于stack exchange,提问作者Ali Raza
相关产品推荐
相关产品推荐

