如何使用Node.js将AWS S3存储桶中已上传图片的名称存入MongoDB数据库
解决方案:将S3图片名称以对象形式存入MongoDB
我来帮你搞定这个问题,你的现有代码里有几处关键错误,同时逻辑上也需要调整才能实现需求。先给你梳理下问题点,再附上修正后的完整代码:
存在的问题分析
- S3上传函数的Body参数错误:
s3Uploadv2里的Body写成了字符串"file.buffer",这会导致上传的是文本而非文件二进制数据,应该直接用file.buffer。 - 文件获取方式错误:因为你用的是
upload.single("image")(单文件上传),所以上传的文件应该通过req.file获取,而不是req.files(多文件上传才用这个)。 - 异步函数未正确等待:调用
s3Uploadv2时没有加await,会导致直接返回Promise对象而不是S3的上传结果,无法提取图片的Key。 - MongoDB保存逻辑问题:创建
SomeModel实例时没有正确提取S3返回的图片Key,而且调用save()时也没加await,无法确保数据成功存入数据库。
修正后的完整代码
修正后的s3.js
require("dotenv").config(); const { S3 } = require("aws-sdk"); const uuid = require("uuid").v4; exports.s3Uploadv2 = async (file) => { const s3 = new S3(); const param = { Bucket: process.env.AWS_BUCKET_NAME, Key: `uploads/${uuid()}`, Body: file.buffer, // 去掉引号,使用实际的文件二进制数据 }; return await s3.upload(param).promise(); };
修正后的POST路由
router.post("/admin/add_profile", upload.single("image"), async (req, res) => { try { // 先等待S3上传完成,获取返回结果 const s3Result = await s3Uploadv2(req.file); // 创建Model实例,将图片Key以对象形式存入image字段 const send = new SomeModel({ first_name: req.body.first_name, last_name: req.body.last_name, phone: req.body.phone, email: req.body.email, image: { name: s3Result.Key } // 以对象形式存储图片名称(S3中的Key) }); // 等待MongoDB保存操作完成 await send.save(); return res.json({ responseMessage: "Everything worked as expected" }); } catch (err) { res.status(400).json(err.message); } });
这样调整后,代码会先完成S3的文件上传,拿到上传后的文件Key(也就是S3里的图片名称),然后把这个Key以{ name: "uploads/xxx" }的对象形式存入MongoDB的image字段,同时确保所有异步操作都正确等待,避免出现Promise未解析的问题。
内容的提问来源于stack exchange,提问作者sumanth.js
相关产品推荐
相关产品推荐

