如何从函数内部取值并全局使用,用于向数据库提交数据?
如何从Multer的diskStorage中获取文件名并存入数据库?
你现在尝试用全局变量imageName传递Multer生成的文件名,虽然能暂时跑通,但这种做法有个致命问题——并发请求时变量会被覆盖,导致数据库存错文件路径。给你两个更可靠的解决方案:
方案一:通过req对象传递文件名
每个请求的req对象都是独立的,不会互相干扰,我们可以把生成的文件名挂载到req上:
var storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, './public/assets/images'); }, filename: function (req, file, cb) { if (!file.originalname.match(/\.(png|jpg|jpeg)$/)) { var err = new Error(); err.code = 'filetype'; return cb(err); } else { const imageName = Date.now() + '_' + file.originalname; req.imageName = imageName; // 把文件名挂载到当前请求的req对象上 cb(null, imageName); } } }); router.post('/newsfeeds', parser.single("myfile"), function (req, res) { // 从当前请求的req中获取文件名 newsfeed.path = req.imageName; newsfeed.save(function (err) { // 记得处理保存后的逻辑,比如返回响应 if (err) { return res.status(500).json({ error: '新闻动态保存失败' }); } res.status(200).json({ message: '新闻动态上传成功' }); }); });
方案二:直接使用Multer提供的req.file对象(更简单)
其实Multer处理完文件后,已经把文件的所有信息存在req.file里了,其中就包含我们需要的文件名filename,完全不用自己额外存储:
var storage = multer.diskStorage({ destination: function (req, file, cb) { cb(null, './public/assets/images'); }, filename: function (req, file, cb) { if (!file.originalname.match(/\.(png|jpg|jpeg)$/)) { var err = new Error(); err.code = 'filetype'; return cb(err); } else { const imageName = Date.now() + '_' + file.originalname; cb(null, imageName); } } }); router.post('/newsfeeds', parser.single("myfile"), function (req, res) { // 直接从req.file中获取Multer生成的文件名 newsfeed.path = req.file.filename; newsfeed.save(function (err) { if (err) { return res.status(500).json({ error: '新闻动态保存失败' }); } res.status(200).json({ message: '新闻动态上传成功' }); }); });
为什么不推荐全局变量?
当多个用户同时上传文件时,全局变量imageName会被最后一个请求的文件名覆盖,导致前面的请求在数据库中存储的路径完全错误,这在生产环境中会引发严重的数据混乱问题,一定要避免这种写法。
内容的提问来源于stack exchange,提问作者Godshand
相关产品推荐
相关产品推荐

