0

Not able to make Angular Universal Application live on cPanel Server

I tried creating a node.js application, putting server files on root and uploading browser folder on the root. whenever I try to run server:ssr script, it throws error and the enite main.js file code shows up.

I event tried using pm2 but got the same issue.

Note - tried with node version 14 and 16 and facing no issues with the same code in localhost.

package.json scripts

"scripts": {
    "ng": "ng",
    "start": "npm run serve:ssr",
    "build": "ng build",
    "watch": "ng build --watch --configuration development",
    "test": "ng test",
    "dev:ssr": "ng run ssr-demo:serve-ssr",
    "serve:ssr": "node dist/ssr-demo/server/main.js",
    "build:ssr": "ng build && ng run ssr-demo:server",
    "prerender": "ng run ssr-demo:prerender"
}

server.ts

import 'zone.js/node';
import { APP_BASE_HREF } from '@angular/common';
import { ngExpressEngine } from '@nguniversal/express-engine';
import * as express from 'express';
import { existsSync } from 'node:fs';
import { join } from 'node:path';
import { AppServerModule } from './src/main.server';

import 'localstorage-polyfill'

// ssr DOM
const domino = require('domino');
const fs = require('fs');
const path = require('path');
// index from browser build!
let distFolder = join(process.cwd(), "browser");
if (!existsSync(distFolder)) {
  distFolder = join(process.cwd(), "dist/ssr-demo/browser");
}
const template = fs.readFileSync(path.join(distFolder, 'index.html')).toString();

// for mock global window by domino
const win = domino.createWindow(template);
// mock
global['window'] = win;
global['localStorage'] = localStorage;
// not implemented property and functions
Object.defineProperty(win.document.body.style, 'transform', {
  value: () => {
    return {
      enumerable: true,
      configurable: true,
    };
  },
});
// mock documnet
global['document'] = win.document;
// othres mock
// global['CSS'] = null;
// global['XMLHttpRequest'] = require('xmlhttprequest').XMLHttpRequest;
// global['Prism'] = null;

// 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/ssr-demo/browser');
  let distFolder = join(process.cwd(), "browser");
  if (!existsSync(distFolder)) {
    distFolder = join(process.cwd(), "dist/ssr-demo/browser");
  }
  const indexHtml = existsSync(join(distFolder, 'index.original.html')) ? 'index.original.html' : 'index';

  // Our Universal express-engine (found @ https://github.com/angular/universal/tree/main/modules/express-engine)
  server.engine('html', ngExpressEngine({
    bootstrap: AppServerModule
  }));

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

  // Example Express Rest API endpoints
  // server.get('/api/**', (req, res) => { });
  // Serve static files from /browser
  server.get('*.*', express.static(distFolder, {
    maxAge: '1y'
  }));

  // All regular routes use the Universal engine
  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;

  // Start up the Node server
  const server = app();
  server.listen(port, () => {
    console.log(`Node Express server listening on http://localhost:${port}`);
  });
}

// Webpack will replace 'require' with '__webpack_require__'
// '__non_webpack_require__' is a proxy to Node 'require'
// The below code is to ensure that the server is run only when not requiring the bundle.
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';

Folder Structure

Root
  main.js
  browser
    index.html
    ... other files

Any help or suggestions would be greatful. Thanks in advance.

0 Answers0