React Native安卓端使用aws-sdk上传S3报Missing Bucket参数错误
问题原因
- 你使用的AWS SDK for JavaScript v2版本在React Native安卓端运行时(尤其是开启Hermes引擎的场景),不会自动继承S3实例初始化时传入的全局
Bucket配置,iOS端的JS运行时会自动继承该配置,因此出现双端表现不一致的问题。 - 你的代码中调用
createBucket方法时没有显式传入Bucket参数,安卓端SDK检测到请求参数缺失就会抛出MissingRequiredParameter: Missing required key 'Bucket' in params错误。
解决方法
方案1(最优,推荐):移除不必要的createBucket调用
如果你的S3存储桶assets已经提前创建完成,不需要每次上传前动态创建,直接删除外层的createBucket逻辑,直接执行上传即可,避免多余请求和参数兼容问题:
// 直接构造上传参数调用upload const params = { Bucket: 'assets', Key: file.name, Body: base64Data, ACL: 'public-read', ContentEncoding: 'base64', ContentType: contentType, }; s3bucket.upload(params, (err, data) => { // 原有上传回调逻辑 console.log(err, data); if (err) { alert('很抱歉出现问题,请重试!'); } if (currentIndex === -1) { const newDocument = { path: data.Location, page: allDocumentPages.length + 1, status: '', id_type: allDocumentPages[0].id_type, }; setAllDocumentPages([...allDocumentPages, newDocument]); } else { const documentToUpdate = allDocumentPages[currentIndex]; documentToUpdate.path = data.Location; documentToUpdate.status = ''; } setLoadingIndex(null); });
方案2:保留createBucket逻辑,补全参数
如果确实需要动态创建存储桶,给createBucket方法显式传入Bucket参数:
s3bucket.createBucket({ Bucket: 'assets' }, e => { const params = { Bucket: 'assets', Key: file.name, Body: base64Data, ACL: 'public-read', ContentEncoding: 'base64', ContentType: contentType, }; // 原有upload逻辑 s3bucket.upload(params, (err, data) => { // 原有上传回调逻辑 }); })
额外兼容优化
为了彻底避免双端参数继承逻辑差异,建议调整S3初始化配置,移除全局Bucket参数,所有请求都显式传入Bucket字段:
export const s3bucket = new S3({ accessKeyId: S3_ACCESS_KEY, secretAccessKey: S3_SECRET_KEY, signatureVersion: 'v4', });
内容的提问来源于stack exchange,提问作者Markus Hayner
相关产品推荐
相关产品推荐

