You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular SSR执行prerender报错window is not defined的解决方法

修复AGM Maps预渲染时window is not defined错误

问题根源

预渲染(prerender)过程在Node.js服务器环境执行,不存在浏览器专属的window对象,直接访问window.location.pathname会触发ReferenceError。

解决方案

通过Angular提供的平台检测工具,仅在浏览器环境下访问window对象,服务器端(预渲染时)使用默认值或替代逻辑。

步骤1:导入平台检测依赖

在AppModule.ts中导入相关工具:

import { PLATFORM_ID, Inject } from '@angular/core';
import { isPlatformBrowser } from '@angular/common';

步骤2:修改工厂函数

更新agmConfigFactory,注入PLATFORM_ID并判断运行环境:

export function agmConfigFactory(
  http: HttpClient, 
  config: LazyMapsAPILoaderConfigLiteral, 
  @Inject(PLATFORM_ID) platformId: object
) {
  let id = '';
  // 仅在浏览器环境下读取window路径
  if (isPlatformBrowser(platformId)) {
    id = window.location.pathname.replace(/\//g, "");
  }
  // 预渲染时可根据需求设置默认id,或通过服务器端请求对象获取路径(如需)

  return () => http.get<any>(`API`).pipe(
    map(response => {
      config.apiKey = response['mapkey'];
      console.log(response['mapkey']);
      return response;
    })
  ).toPromise();
}

步骤3:更新依赖注入

在providers数组的deps中添加PLATFORM_ID:

providers: [
  {
    provide: APP_INITIALIZER,
    useFactory: agmConfigFactory,
    deps: [HttpClient, LAZY_MAPS_API_CONFIG, PLATFORM_ID],
    multi: true
  }
],

可选:服务器端路径获取(如需)

如果预渲染时需要获取请求路径,可注入Angular Universal的REQUEST token(需先配置Universal):

import { REQUEST } from '@nguniversal/express-engine/tokens';

// 工厂函数中注入REQUEST
export function agmConfigFactory(
  http: HttpClient, 
  config: LazyMapsAPILoaderConfigLiteral, 
  @Inject(PLATFORM_ID) platformId: object,
  @Inject(REQUEST) request: any
) {
  let id = '';
  if (isPlatformBrowser(platformId)) {
    id = window.location.pathname.replace(/\//g, "");
  } else {
    // 服务器端从请求对象获取路径
    id = request.path.replace(/\//g, "");
  }

  // 后续逻辑不变
}

// 更新deps
deps: [HttpClient, LAZY_MAPS_API_CONFIG, PLATFORM_ID, REQUEST],

内容的提问来源于stack exchange,提问作者Calvin Care

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 12:35:19