fix: ensure SSR always fetches fresh assets from database #9
@@ -7,25 +7,22 @@ import {
|
||||
import * as http from 'node:http';
|
||||
|
||||
/**
|
||||
* Lazily instantiate AngularNodeAppEngine so the engine boots only when
|
||||
* the first request arrives. All routes use RenderMode.Server — every
|
||||
* request triggers on-demand SSR that fetches fresh API data before rendering.
|
||||
* Manually import and register the Angular app engine manifest.
|
||||
* The Angular 21 builder generates angular-app-engine-manifest.mjs at build time
|
||||
* but does NOT automatically inject the import into server.mjs.
|
||||
* Without this, AngularNodeAppEngine fails with "Angular app engine manifest is not set"
|
||||
* and every SSR request returns 404.
|
||||
*/
|
||||
let appEngine: AngularNodeAppEngine | null = null;
|
||||
function getEngine(): AngularNodeAppEngine {
|
||||
if (!appEngine) {
|
||||
appEngine = new AngularNodeAppEngine();
|
||||
}
|
||||
return appEngine;
|
||||
}
|
||||
// @ts-ignore — generated at build time by @angular/build
|
||||
import engineManifest from './angular-app-engine-manifest.mjs';
|
||||
import { ɵsetAngularAppEngineManifest } from '@angular/ssr';
|
||||
ɵsetAngularAppEngineManifest(engineManifest);
|
||||
|
||||
const appEngine = new AngularNodeAppEngine();
|
||||
|
||||
/**
|
||||
* Handle incoming requests using the Angular SSR engine.
|
||||
* Every request is rendered on the server with fresh data from the API.
|
||||
*/
|
||||
const requestHandler = createNodeRequestHandler(async (req, res, next) => {
|
||||
try {
|
||||
const response = await getEngine().handle(req);
|
||||
const response = await appEngine.handle(req);
|
||||
|
||||
if (response) {
|
||||
await writeResponseToNodeResponse(response, res);
|
||||
@@ -37,17 +34,24 @@ const requestHandler = createNodeRequestHandler(async (req, res, next) => {
|
||||
}
|
||||
});
|
||||
|
||||
export default requestHandler;
|
||||
|
||||
if (isMainModule(import.meta.url)) {
|
||||
const httpServer = http.createServer();
|
||||
httpServer.on('request', async (req: http.IncomingMessage, res: http.ServerResponse) => {
|
||||
requestHandler(req, res, () => {
|
||||
console.log('Node.js SSR server ready');
|
||||
const server = http.createServer();
|
||||
server.on('request', async (req, res) => {
|
||||
try {
|
||||
await requestHandler(req, res, () => {
|
||||
res.statusCode = 404;
|
||||
res.end('Not Found');
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('SSR error:', error);
|
||||
res.statusCode = 500;
|
||||
res.end('Internal server error');
|
||||
}
|
||||
});
|
||||
httpServer.listen(4200, () => {
|
||||
console.log(`Node SSR server listening on http://localhost:4200`);
|
||||
server.listen(4200, () => {
|
||||
console.log('SSR server listening on http://localhost:4200');
|
||||
});
|
||||
}
|
||||
|
||||
export { requestHandler };
|
||||
Reference in new issue
Block a user