Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ionic with SSR implementation

Trying to add js function to my ionic project but getting self is not defined error. After trying to add self as global ["self"] = win.self || win; I get an error

ERROR TypeError: Cannot redefine property: constructor . Use the latest version of all required dependencies in the project.

server.ts

import "zone.js/dist/zone-node";

import { ngExpressEngine } from "@nguniversal/express-engine";
import * as express from "express";
import { join } from "path";
import { enableProdMode } from "@angular/core";
import { AppServerModule } from "./src/main.server";
import { APP_BASE_HREF } from "@angular/common";
import { existsSync } from "fs";

enableProdMode();
export function app(): express.Express {
  const server = express();
  const distFolder = join(process.cwd(), "dist/app/browser");
  const indexHtml = existsSync(join(distFolder, "index.original.html"))
    ? "index.original.html"
    : "index";
  const domino = require("domino");
  const win = domino.createWindow(indexHtml);
  // mock
  global["window"] = win;
  global["self"] = win.self;
  global["document"] = win.document;
  global["navigator"] = win.navigator;
  server.engine("html", ngExpressEngine({ bootstrap: AppServerModule }));

  server.set("view engine", "html");
  server.set("views", distFolder);

  server.get(
    "*.*",
    express.static(distFolder, {
      maxAge: "1y",
    })
  );

  server.get("*", (req, res) => {
    res.render(indexHtml, {
      req,
      providers: [{ provide: APP_BASE_HREF, useValue: req.baseUrl }],
    });
  });
  return server;
}
function run(): void {
  const port = process.env.PORT || 4000;

  const server = app();
  server.listen(port, () => {
    console.log(`Node express server listening on http://localhost:${port}`);
  });
}
declare const __non_webpack_require__: NodeRequire;
const mainModule = __non_webpack_require__.main;
const moduleFilename = (mainModule && mainModule.filename) || "";
if (moduleFilename === __filename || moduleFilename.includes("iisnode")) {
  run();
}
export * from "./src/main.server";
like image 500
Лёша Сугуров Avatar asked Dec 14 '25 14:12

Лёша Сугуров


1 Answers

I'm having the same issue. Added these lines to my server.ts file and after adding global['self'] = win; the error is occurred. Without it self is undefined error is shown.

const domino = require('domino');

const templateA = readFileSync(join(distFolder, indexTemplate)).toString();
const win = domino.createWindow(templateA);
(win as any).Object = Object;
(win as any).Math = Math;
global['self'] = win; //TODO: Is giving ERROR TypeError: Cannot redefine property: constructor at Function.defineProperty
global['window'] = win;
global['win'] = win;
global['branch'] = null;
like image 169
ilprima Avatar answered Dec 16 '25 23:12

ilprima



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!