#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
к вызовам библиотеки.