“在Angular服务中未定义窗口,但代码运行正常

问题描述 投票:1回答:1

我在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');
angular indexeddb
1个回答
0
投票

这里有一个相关的问题:https://github.com/hellosign/hellosign-embedded/issues/107基本上,为避免该错误,可以在全局窗口中声明某处。

if (typeof window === 'undefined') {
    global.window = {}
}
© www.soinside.com 2019 - 2024. All rights reserved.