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

S3.getObject().promise()返回SignatureDoesNotMatch的原因咨询

问题原因分析与修复

你的猜测不正确,核心问题是同时使用了回调函数和.promise()方法,导致AWS SDK v2发起了两次独立的GET请求,具体细节如下:

  • AWS SDK v2的异步逻辑设计:当你调用s3.getObject(params, callback)时,SDK会立刻发起请求并通过回调返回结果;如果紧接着链式调用.promise(),SDK会将其视为一个全新的异步操作,再次发起请求。
  • 两次请求的标识差异:x-amz-user-agent里的callback和callback promise,就是SDK用来标记这两种不同调用模式的,这直接证明了是两次独立的请求。
  • 签名不匹配的诱因:第二次请求的签名异常,本质是因为这是一个重复发起的独立请求,可能因SDK内部签名生成时的上下文差异(比如时间戳、请求元数据的细微变化)导致签名验证失败,但根源还是重复请求。

正确写法示例

你需要二选一使用异步模式,不要混合:

方案1:使用Promise + await

try {
  const data = await s3.getObject({ Bucket: bucketName, Key: key }).promise();
  // 处理data.Body解码逻辑
} catch (err) {
  throw new Error(`Can't get object from "${bucketName}/${key}".`);
}

方案2:仅使用回调函数

s3.getObject({ Bucket: bucketName, Key: key }, (err, data) => {
  if (err) {
    throw new Error(`Can't get object from "${bucketName}/${key}".`);
  }
  // 处理data.Body解码逻辑
});

内容的提问来源于stack exchange,提问作者wychoi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:35:20