如何获取AWS S3图片URL并存入MongoDB,解决req.file.location未定义问题
问题解决方法
问题原因
- multer 生成的
req.file对象本身不存在location属性,S3上传成功后的返回值才包含图片的公网URL - 原代码逻辑顺序错误:先初始化Rope实例赋值image字段,再执行S3上传操作,此时还没有获取到S3返回的URL,自然返回undefined
- AWS SDK的upload接口返回的URL字段为大写开头的
Location,原代码调用小写的location也会取不到值
修正方案
调整执行顺序,先执行S3上传拿到返回结果,再初始化Rope实例赋值,代码修改如下:
const upload = multer({ dest:'uploads/' }) const {uploadFile} = require('../s3') const fs = require('fs') // 可选,用于删除本地临时文件 router.post('/', upload.single('image'), async (req, res) => { try { // 第一步:先上传文件到S3,拿到返回结果 const s3UploadResult = await uploadFile(req.file) // 可选:删除multer存在本地的临时文件,避免占用磁盘空间 fs.unlink(req.file.path, (err) => { if (err) console.log('临时文件删除失败:', err) }) // 第二步:用S3返回的URL初始化Rope实例 const rope = new Rope({ title: req.body.title, description: req.body.description, image: s3UploadResult.Location, price: req.body.price, cartQuantity: req.body.cartQuantity, }); await rope.save(); res.status(201).json(rope); console.log(req.body) } catch (err) { res.status(400).send(err); } });
内容的提问来源于stack exchange,提问作者Josip Marić
相关产品推荐
相关产品推荐

