Node.js(Express)控制器向模型传参及图片上传参数处理
解决方案
1. 传递并验证shopid和image参数
image参数由multer的.single('userPhoto')处理,需确保前端传参的文件字段名为userPhoto;shopid可从请求Body或Query中获取(根据你的API设计选择),以下是添加基础验证逻辑的代码:
var AddVendorGalleryStorage = multer.diskStorage({ destination: function (req, file, callback) { callback(null, './uploads'); }, filename: function (req, file, callback) { // 移除重复引入的sizeOf模块 const originalname = file.originalname; const fileExt = originalname.split(".").pop(); const excatName = originalname.split(".").slice(0, -1).join("."); console.log("mimetype is " + file.mimetype); callback(null, excatName + "-" + Date.now().toString() + "." + fileExt); }, }); var AddVendorGalleryExtensionCheck = (req, file, cb) => { const memeT = file.mimetype.split('/')[1]; const restrictToMemeType = ['jpeg','jpg','png','gif']; if (restrictToMemeType.includes(memeT)) { cb(null, true); } else { cb(new Error('抱歉,不支持该文件类型'), false); } }; var uploadgallery = multer({ storage: AddVendorGalleryStorage, fileFilter: AddVendorGalleryExtensionCheck }).single('userPhoto'); const addVendorGallery = async (req, res) => { uploadgallery(req,res,async function(err) { // 处理multer上传错误 if(err) { return res.status(400).send("文件上传失败:" + err.message); } // 验证shopid参数 const shopid = req.body.shopid; // 若用Query传参则改为req.query.shopid if (!shopid) { return res.status(400).send("缺少必填参数:shopid"); } // 额外验证shopid格式(示例:检查是否为有效数字) if (isNaN(shopid)) { return res.status(400).send("shopid必须为有效数字"); } // 验证文件是否存在 if (!req.file) { return res.status(400).send("缺少必填文件:请上传字段名为userPhoto的图片"); } // 参数验证通过,执行后续数据库操作 // ... }); };
2. 上传成功后传递参数至模型执行数据库操作
文件上传且参数验证通过后,将shopid和文件相关信息(如存储路径、原文件名等)组装成数据对象,调用数据库模型方法执行操作即可:
// 在addVendorGallery的multer回调中,参数验证通过后添加以下代码 try { // 假设你的数据库模型为VendorGalleryModel,包含create方法 const galleryRecord = await VendorGalleryModel.create({ shop_id: shopid, image_path: `/uploads/${req.file.filename}`, // 存储文件访问路径 original_filename: req.file.originalname, upload_time: new Date() }); res.status(200).send({ message: "文件上传并保存成功", data: galleryRecord }); } catch (dbErr) { res.status(500).send("数据库操作失败:" + dbErr.message); }
额外提示
- 若需要更严谨的参数验证,可使用
express-validator库,示例:const { body, validationResult } = require('express-validator'); // 在路由中添加验证中间件 app.post('/vendor/gallery', [ body('shopid').isNumeric().withMessage('shopid必须为有效数字'), ], addVendorGallery); // 在addVendorGallery中捕获验证错误 const errors = validationResult(req); if (!errors.isEmpty()) { return res.status(400).json({ errors: errors.array() }); } - 文件存储路径建议使用相对路径或完整URL,方便前端后续访问图片。
内容的提问来源于stack exchange,提问作者Diana
相关产品推荐
相关产品推荐

