Debug compilation errors errors using Angular Universal in Angular 8 Application

Debug compilation errors errors using Angular Universal in Angular 8 Application

一个简短的背景故事

我一直在对 Angular 8 应用程序实施多次升级,例如服务器端呈现和 Google 分析。正如大多数开发人员所做的那样,我会编码然后测试然后继续下一个任务。通常我在开发应用程序时使用 ng serve 到 运行。

对于服务器端渲染、测试速度、延迟加载图像等,您需要在生成的 JS 文件上使用 node express 服务器 运行ning。在构建等之后,我使用 Node prerender(我的 js 文件是 prerender.js)来查看应用程序在服务器上预呈现的样子。

当我 运行 这个命令时,我应该不会收到任何错误,而且我知道我的 prender 文件将在端口 4000 上启动本地服务器。

问题

我在 运行 连接一个 node express 服务器时出现错误,而我在 运行 ng serve 时没有得到 我最近收到一个错误说:

Unhandled Promise rejection: Cannot read property 'subscribe' of undefined ; Zone: <root> ; Task: Promise.then ; Value: TypeError: Cannot read property 'subscribe' of undefined
    at new ApplicationRef (C:towerdevelopment\dist-stage\server\main.js:45910:37)
    at _createClass (C:towerdevelopment\dist-stage\server\main.js:37184:20)
    at _createProviderInstance (C:towerdevelopment\dist-stage\server\main.js:37138:26)
    at initNgModule (C:towerdevelopment\dist-stage\server\main.js:37044:32)
    at new NgModuleRef_ (C:towerdevelopment\dist-stage\server\main.js:38176:9)
    at Object.createNgModuleRef (C:towerdevelopment\dist-stage\server\main.js:38159:12)
    at NgModuleFactory_.create (C:towerdevelopment\dist-stage\server\main.js:50821:25)
    at C:towerdevelopment\dist-stage\prerender.js:29175:43
    at ZoneDelegate.invoke (C:towerdevelopment\dist-stage\prerender.js:481:26)
    at Object.onInvoke (C:towerdevelopment\dist-stage\prerender.js:28683:33) TypeError: Cannot read property 'subscribe' of undefined
    at new ApplicationRef (C:towerdevelopment\dist-stage\server\main.js:45910:37)
    at _createClass (C:towerdevelopment\dist-stage\server\main.js:37184:20)
    at _createProviderInstance (C:towerdevelopment\dist-stage\server\main.js:37138:26)
    at initNgModule (C:towerdevelopment\dist-stage\server\main.js:37044:32)
    at new NgModuleRef_ (C:towerdevelopment\dist-stage\server\main.js:38176:9)
    at Object.createNgModuleRef (C:towerdevelopment\dist-stage\server\main.js:38159:12)
    at NgModuleFactory_.create (C:towerdevelopment\dist-stage\server\main.js:50821:25)
    at C:towerdevelopment\dist-stage\prerender.js:29175:43
    at ZoneDelegate.invoke (C:towerdevelopment\dist-stage\prerender.js:481:26)
    at Object.onInvoke (C:towerdevelopment\dist-stage\prerender.js:28683:33)

最接近这让我弄清楚到底是什么导致了问题的是让我知道某个地方的提供者导致了这个错误。看起来有些东西应该是可观察的而不是订阅。除此之外,我想我只是开始查看我的提供者。我的问题是:

  1. 如何在使用 ng serve 进行开发时强制 Angular 抛出此错误?
  2. 如果我不能,除了梳理每个提供程序之外,是否有更好的方法来调试当前错误?或者至少是一种判断是什么服务导致了问题的方法?

谢谢。

更新: 基本回购有问题 here. I made a new angular project, made sure dependencies were up to date, installed ngUniversal per ,并在 运行ning node prerender[=19= 时收到相同的未处理承诺消息]

Verbatim 我去了 Angular cli 网站,创建了一个新项目(默认安装的 Angular 版本是 8.3),安装了 Angular Universal,并尝试构建。与上面相同的错误消息。

这看起来像是 ApplicationRef 触发了错误,而 class 是由 Angular 核心内部提供的。

它可能在 class 的构造函数中失败,并且在 Zone observables 上有一些对 subscribe 的调用。我认为您不会在源代码中找到与此错误直接相关的任何内容。看起来像是构建配置问题。

https://github.com/angular/angular/blob/bb52fb798c8578c461d21aee2b7623232184a5d3/packages/core/src/application_ref.ts#L562

我不知道什么可能会产生这个问题,但我会用 SSR 开始一个新项目,并将差异与您当前的项目进行比较。

最终,我放弃了使用预渲染的 angular 6 方法,并使用了最新的通用包。使用 npm run build:ssr 构建并在快速服务器中提供 dist/server.js 似乎没有问题。我不确定预渲染方法有什么问题,但它似乎已经过时了。 @Reactgular 感谢反馈。