AWS SDK V3 S3Client в web worker выдает ошибку ReferenceError: окно не определено

#vue.js #web-worker #aws-sdk-js

#vue.js #веб-работник #aws-sdk-js

Вопрос:

В приложении 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;
}
 

Я знаю, что веб-работники работают в другом контексте и не имеют доступа к окну основного потока. Я проследил за клиентом библиотеки AWS-s3 после 3.0.0 и увидел, что (по какой-то причине) он предполагает существование window .

Есть ли какой-то трюк с использованием клиента S3 в web worker или это ошибка?

Комментарии:

1. Обратите внимание, что эта проблема была исправлена в @aws-sdk / client-s3 версии 3.12.0, так что это не проблема.

Ответ №1:

это сработало для меня на AWS dynamodb, поместив это где-нибудь в коде

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

v3 сейчас работает над cloudflare.

Комментарии:

1. Ты тот человек @JohnnyRivers, который полностью решил проблему! Чтобы другие не нашли это, мы должны уточнить, что когда вы говорите «где-то в коде», вы имеете в виду «где-то в модуле web worker», поскольку назначение должно быть в контексте web worker, который отделен от основного потока. FWIW Я безуспешно пытался объявить window внешнее объявление в модуле и не понимал, что self.window удовлетворяет попыткам доступа window к вызовам библиотеки.