我在Angular 8服务中使用indexeddb,并且需要window
。该代码的构建没有错误,该应用程序完美地创建了数据库对象库。但是在生产模式下运行时(使用实际节点服务器而不是ng serve时不会发生此错误),我在运行角度为终端的情况下收到此错误:
ERROR ReferenceError: window is not defined
at IndexedDBService.isSupported (D:\MartijnFiles\Documents\Programming\Fenego\fenego-labs-angular\dist\server.js:71199:9)
at IndexedDBService.openDB (D:\MartijnFiles\Documents\Programming\Fenego\fenego-labs-angular\dist\server.js:71203:18)
at Promise (D:\MartijnFiles\Documents\Programming\Fenego\fenego-labs-angular\dist\server.js:72026:46)
同样,所有操作均有效,并且如果isSupported()
实际上未定义,openDB()
函数将停止运行window
。浏览器控制台中也没有错误。
这是我服务的相关部分。
@Injectable()
export class IndexedDBService {
isSupported(): boolean {
return !!window.indexedDB;
}
openDB(dbName: string,
version: number,
onUpgradeNeededCallback: OnUpgradeNeededCallback,
onSuccessCallback: OnOpenSuccessCallback,
onErrorCallback: OnOpenErrorCallback,
onBlockedCallback: OnOpenBlockedCallback): Observable<IDBOpenDBRequest> {
let openDBRequest: IDBOpenDBRequest = null;
if (this.isSupported()) {
openDBRequest = window.indexedDB.open(dbName, version);
openDBRequest.onupgradeneeded = onUpgradeNeededCallback;
openDBRequest.onsuccess = onSuccessCallback;
openDBRequest.onerror = onErrorCallback;
openDBRequest.onblocked = onBlockedCallback;
}
return of(openDBRequest);
}
[这里有很多建议的“解决方案”,这些解决方案主要归结为通过服务或简单注入来提供它(例如,此博客https://willtaylor.blog/angular-universal-gotchas/中的第1点),但是它所做的只是通过注入将其他服务从其他窗口传递给矿。但是我的代码有效,因此显然可以访问窗口...
更新:
组件ngOnInit()
中的下一行具有与“未定义” Worker相同的问题,但该Worker已加载并完美运行:
const offlineProductsWorker = new Worker('webworkers/offline-products-worker.js');
这里有一个相关的问题:https://github.com/hellosign/hellosign-embedded/issues/107基本上,为避免该错误,可以在全局窗口中声明某处。
if (typeof window === 'undefined') {
global.window = {}
}