【问题标题】:AWS SDK V3 S3Client in web worker throws ReferenceError: window is not definedWeb Worker 中的 AWS SDK V3 S3Client 引发 ReferenceError:未定义窗口
【发布时间】:2021-03-18 10:34:42
【问题描述】:

在 Vue JS 应用程序中,我使用网络工作者生成签名 URL。此代码使用@aws-sdk/client-s3 3.0.0 版没有问题。但是,更高版本的 getSignedUrl() 调用失败,并出现错误“ReferenceError: window is not defined”。

(worker.js)

import { S3Client, GetObjectCommand } from '@aws-sdk/client-s3';
import { getSignedUrl } from '@aws-sdk/s3-request-presigner';

async function generateUrls(s3config, bucket, filename) {

  let getParams = {
    Bucket: bucket,
    Key: filename
  };
  let url;

  const clientS3 = new S3Client(s3config);

  const getCmd = new GetObjectCommand(getParams);
  try {
    url = await getSignedUrl(clientS3, getCmd);
  } catch (err) {
    console.log('Error getting signed URL ', err);
  }

  return url;
}

我知道网络工作者在不同的上下文中运行,并且无法访问主线程的窗口。我在 3.0.0 之后跟踪到 AWS 库 client-s3 并看到(出于某种原因)它假定存在 window

在 Web Worker 中使用 S3 客户端是否有一些技巧,或者这是一个错误?

【问题讨论】:

  • 请注意,此问题已在 @aws-sdk/client-s3 版本 3.12.0 中修复,因此已不再存在问题。

标签: vue.js web-worker aws-sdk-js


【解决方案1】:

通过将它放在代码中的某个位置,它在 AWS dynamodb 上对我有用

if(typeof window != "object")
    self.window = self;

v3 现在正在开发 cloudflare。

【讨论】:

  • 你就是@JohnnyRivers,绝对解决了问题!为了其他人发现这一点,我们应该澄清一下,当您说“代码中的某处”时,您的意思是“Web Worker 模块中的某处”,因为分配必须在 Web Worker 的上下文中,这与主线程是分开的. FWIW 我尝试在模块外部声明 window 失败了,并且不明白 self.window 满足在库调用中访问 window 的尝试。
猜你喜欢
  • 2021-03-30
  • 2020-10-08
  • 2018-05-27
  • 2020-09-18
  • 2021-02-02
  • 2013-12-06
  • 2020-11-12
  • 2018-10-29
  • 1970-01-01
相关资源
最近更新 更多