3

CookieConsent 和库版本?

- cookieconsent version: 3.1.1
- ngx-cookieconsent version: 2.2.3
- Angular CLI: 10.0.3
- Angular SSR (universal)

我正在运行以下命令:

npm run build:ssr && npm run serve:ssr

在哪里:

"serve:ssr": "node dist/compy/server/main.js",

"build:ssr": "ng build --prod && ng run compy:server:production",

失败给出的日志

Node Express server listening on http://localhost:4000

ERROR TypeError: Cannot read property 'initialise' of undefined
    at NgcCookieConsentService.init (C:\Coding\compyFront\dist\compy\server\main.js:1:3482889)
    at new NgcCookieConsentService (C:\Coding\compyFront\dist\compy\server\main.js:1:3482119)
    at Object.NgcCookieConsentService_Factory [as factory] (C:\Coding\compyFront\dist\compy\server\main.js:1:3484065)
    at R3Injector.hydrate (C:\Coding\compyFront\dist\compy\server\main.js:1:2802301)
    at R3Injector.get (C:\Coding\compyFront\dist\compy\server\main.js:1:2799033)
    at NgModuleRef$1.get (C:\Coding\compyFront\dist\compy\server\main.js:1:2977443)
    at Object.get (C:\Coding\compyFront\dist\compy\server\main.js:1:2946537)
    at getOrCreateInjectable (C:\Coding\compyFront\dist\compy\server\main.js:1:2713691)
    at Module.ɵɵdirectiveInject (C:\Coding\compyFront\dist\compy\server\main.js:1:2832947)
    at NodeInjectorFactory.AppComponent_Factory [as factory] (C:\Coding\compyFront\dist\compy\server\main.js:1:1694986)

提及任何其他可能有用的细节

它在常规应用程序中运行良好,但在通用角度应用程序中失败,所以我认为这主要是由于在服务器端模式下运行时试图打开一个窗口或对话框。或者,我可能需要以某种方式将它添加到 angular.json 配置文件之外的其他地方。

请告诉我您需要的任何文件,我不能发布整个项目,因为它是私有的,但我可以毫无问题地交付单个文件。

4

3 回答 3

5

对我来说,通过将cookieconsent.min.cssand添加cookieconsent.min.jsangular.json

"styles": [
            "./node_modules/cookieconsent/build/cookieconsent.min.css"
          ],
          "scripts": [
            "./node_modules/cookieconsent/build/cookieconsent.min.js"
          ]
于 2021-04-17T10:00:05.920 回答
2

NgcCookieConsentService 无法在服务器端初始化,因为全局窗口属性未定义。他们代码中的作者似乎处理了一个 Angular Universal 案例(cookieconsent.service.ts:134),但这仍然不适用于 Angular 10。

我的紧急快速修复是在server.ts中定义一个空函数“initialize” ,该函数使用“@nguniversal/express-engine”中间件运行 Express 服务器。也许并不完美,但它有效,并且是使我的项目在生产中工作的一种解决方法。

...

function setBrowserGlobals(distFolder) {
    const template = readFileSync(join(distFolder, 'index.html')).toString();
    const domino = require('domino');
    const win = domino.createWindow(template);

    global['window'] = win;
    global['document'] = win.document;
    global['Node'] = win.Node;
    global['navigator'] = win.navigator;
    global['Event'] = win.Event;
    global['Event']['prototype'] = win.Event.prototype;
    global['localStorage'] = localStorage;
    global['window']['gtag'] = function () {};
    global['window']['cookieconsent'] = { initialise: function () {
        console.warn('Cookie consent is not working on server side');
    } };
}

// The Express app is exported so that it can be used by serverless Functions.
export function app(): express.Express {
    const server = express();
    const distFolder = join(process.cwd(), 'dist/browser');
    const indexHtml = existsSync(join(distFolder, 'index.original.html')) ? 'index.original.html' : 'index';

    setBrowserGlobals(distFolder);

   ...
}
于 2020-09-21T15:50:00.573 回答
0

对于收到此错误但不使用 Universal 的人:当您忘记安装 CookieConsent 时也会显示此错误(在 angular.json 样式/脚本中带有适当的文件引用)。

于 2020-11-16T14:51:13.703 回答