【问题标题】:ReferenceError: window is not defined in angular universalReferenceError:窗口未在角度通用中定义
【发布时间】:2020-12-30 07:58:59
【问题描述】:

我正在尝试使用@nguniversal/express-engine,并且我已经安装并尝试运行它,但它在 main.js 文件中出现错误。

这是我遇到的错误

    C:\Folder\ssr\dist\ssr\server\main.js:179450
})(window, function() {
   ^

ReferenceError: window is not defined
    at Object.rdXg (C:\Folder\ssr\dist\ssr\server\main.js:179450:4)
    at __webpack_require__ (C:\Folder\ssr\dist\ssr\server\main.js:26:30)
    at Module.+PDj (C:\Folder\ssr\dist\ssr\server\main.js:133:66)
    at __webpack_require__ (C:\Folder\ssr\dist\ssr\server\main.js:26:30)
    at Module.xCqK (C:\Folder\ssr\dist\ssr\server\main.js:198481:92)
    at __webpack_require__ (C:\Folder\ssr\dist\ssr\server\main.js:26:30)
    at Module.xLoe (C:\Folder\ssr\dist\ssr\server\main.js:200042:86)
    at __webpack_require__ (C:\Folder\ssr\dist\ssr\server\main.js:26:30)
    at Module.Mm/0 (C:\Folder\ssr\dist\ssr\server\main.js:89135:105)
    at __webpack_require__ (C:\Folder\ssr\dist\ssr\server\main.js:26:30)

A server error has occurred.
node exited with 1 code.
connect ECONNREFUSED 127.0.0.1:59195

我尝试了很多东西,但没有任何效果。

导致问题的打印函数和打印函数被 print-js 库使用

 const contentToConvert = document.getElementById('content');
this.selectedFunctionCode = htmlToImage.toPng;
const debugBase64 = this.debugBase64;
this.selectedFunctionCode(contentToConvert)
  .then((dataUrl) => {
        print(dataUrl, 'image');
  })
  .catch((error) => {
    console.error('oops, something went wrong!', error);
  });

【问题讨论】:

标签: node.js angular angular-universal angular-seo


【解决方案1】:

因为像localstorage这样的对象,在客户端的窗口使用没有在服务器端定义你必须首先检查你的浏览器平台是否准备好然后使用这些对象 为此,您可以这样做:

首先像这样生成 check-is-browserService.service.ts:

export class CheckIsBrowserService {
  private isBrowser = new BehaviorSubject<boolean>(null);

  constructor() {}

  getIsBrowser(): Observable<any> {
    return this.isBrowser;
  }

  setIsBrowser(value: any) {
    this.isBrowser.next(value);
  }
}

app.component.ts

constructor(
  @Inject(PLATFORM_ID) private platformId: any, 
  private checkIsBrowserService: CheckIsBrowserService
){
  this.checkIsBrowserService.setIsBrowser(isPlatformBrowser(platformId));
}

然后生成服务,例如window.service.ts

class Window implements Window {
  readonly innerWidth: number;
}

@Injectable({
  providedIn: 'root',
})
export class WindowService {
  private config: Window;

  constructor(private checkIsBrowserService: CheckIsBrowserService) {
    this.config = new Window();
    this.checkIsBrowserService.getIsBrowser().subscribe((isBrowser) => {
      if (isBrowser) {
        this.config = window;
      }
    });
  }
  innerWidth() {
    return this.config.innerWidth;
  }
}

在你的组件中使用 window.innerwidth 时,你必须将其更改为

x.component.ts:

 constructor(private window: WindowService) {
   if (this.window.innerWidth() <= 1024) {
     //your code
   }
 }

【讨论】:

  • 在进行所有更改后仍然出现相同的错误。 @HostListener('window:resize', ['$event']) 这也需要处于状态
  • 您确定要进行所有更改吗?因为我测试它知道并使用@HostListener('window:resize',['$event'])正常工作。不,此条件仅用于测试是否要使用 window.innerWidth,最后是否可以,您可以分享您的代码
  • 是的,有 print() 函数给出错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-02
  • 1970-01-01
  • 1970-01-01
  • 2021-03-30
  • 2020-10-08
  • 2018-05-27
  • 2020-09-18
相关资源
最近更新 更多