无法将数据写入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
相关产品推荐
相关产品推荐

