You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 13:17:37