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

无法将数据写入Amazon S3:日志显示成功但Bucket中无文件

Node.js S3 上传日志显示成功但Bucket中无文件的问题

我用一段Node.js函数向AWS S3写入文件,代码如下:

function writeToS3(filePath, data) {
  try {
    let s3 = new AWS.S3();
    s3.config.update({ accessKeyId: process.env.AWSACCESSKEY, secretAccessKey: process.env.AWSSECRET });
   var params = {
     Body: String(data),
     Bucket: process.env.AWSBUCKET,
     Key: filePath,
   };
   s3.upload(params, async function (err, data) {
      if (err) {
       console.error(err, err.stack);
      } else {
       console.log(`Uploading ${data}succesfully`)
       return data;
      }
   });
 } catch (ex) {
   console.error(`S3 ${filePath} error ${ex.message}.`);
   return null;
  }
}
module.exports = { readFromS3, writeToS3 };

调用代码:

let Aws = require('../util/s3service')
Aws.writeToS3("/file1", "hello world")

执行后控制台输出:

Uploading [object Object]succesfully

调试时能看到回调里的data对象,但通过WinSCP检查发现目标Bucket中没有该文件,全程无报错,请问问题出在哪里?


问题排查与解决

  • 对象键(Key)格式错误
    AWS S3的对象键不应该以斜杠开头,你传入的/file1会被当作完整的对象键存储,而非你预期的file1。WinSCP中如果直接查找file1自然找不到,需要改为file1(去掉开头斜杠),或者在代码中自动处理:Key: filePath.replace(/^\//, '')。

  • 缺失S3区域配置
    代码仅配置了密钥和Bucket名,未指定S3服务的区域。AWS SDK会使用默认区域,若你的Bucket不在该区域,上传请求会被发送到错误区域,导致目标Bucket中无文件。需添加区域配置:

    s3.config.update({ 
      accessKeyId: process.env.AWSACCESSKEY, 
      secretAccessKey: process.env.AWSSECRET,
      region: '你的Bucket所在区域,如us-east-1'
    });
    
  • 异步流程处理不当
    外层try/catch无法捕获s3.upload回调中的异步错误,且回调里的return data对外层函数无意义。建议改用Promise形式的API来规范异步流程,同时调用时需等待上传完成:

    async function writeToS3(filePath, data) {
      try {
        const s3 = new AWS.S3({
          accessKeyId: process.env.AWSACCESSKEY,
          secretAccessKey: process.env.AWSSECRET,
          region: '你的Bucket区域'
        });
        const params = {
          Body: String(data),
          Bucket: process.env.AWSBUCKET,
          Key: filePath.replace(/^\//, '')
        };
        const uploadResult = await s3.upload(params).promise();
        console.log(`上传成功:${uploadResult.Location}`);
        return uploadResult;
      } catch (ex) {
        console.error(`S3上传错误 ${filePath}:${ex.message}`);
        return null;
      }
    }
    

    调用代码修改为:

    const Aws = require('../util/s3service');
    await Aws.writeToS3("/file1", "hello world");
    
  • 环境变量验证
    确认process.env.AWSBUCKET的值完全正确,无拼写错误,确保上传的目标Bucket与你在WinSCP中查看的是同一个。


内容的提问来源于stack exchange,提问作者Alex-1999

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 21:22:26