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.