Skip to content

Commit bfa8fec

Browse files
committed
fix(@angular/build): use named export reqHandler for server.ts request handling
Some cloud providers, such as Cloudflare, expect the default export to follow a specific structure (e.g., an object with a `fetch` property). To prevent the need for creating a separate `server.ts` file for production builds, the request handler is now exported as `reqHandler` instead of a default export.
1 parent 01f7475 commit bfa8fec

File tree

10 files changed

+49
-30
lines changed

10 files changed

+49
-30
lines changed

packages/angular/build/src/tools/vite/middlewares/ssr-middleware.ts

+8-10
Original file line numberDiff line numberDiff line change
@@ -92,20 +92,18 @@ export async function createAngularSsrExternalMiddleware(
9292
next: Connect.NextFunction,
9393
) {
9494
(async () => {
95-
const { default: handler, AngularAppEngine } = (await server.ssrLoadModule(
96-
'./server.mjs',
97-
)) as {
98-
default?: unknown;
95+
const { reqHandler, AngularAppEngine } = (await server.ssrLoadModule('./server.mjs')) as {
96+
reqHandler?: unknown;
9997
AngularAppEngine: typeof SSRAngularAppEngine;
10098
};
101-
102-
if (!isSsrNodeRequestHandler(handler) && !isSsrRequestHandler(handler)) {
99+
if (!isSsrNodeRequestHandler(reqHandler) && !isSsrRequestHandler(reqHandler)) {
103100
if (!fallbackWarningShown) {
104101
// eslint-disable-next-line no-console
105102
console.warn(
106-
`The default export in 'server.ts' does not provide a Node.js request handler. ` +
103+
`The 'reqHandler' export in 'server.ts' is either undefined or does not provide a recognized request handler. ` +
107104
'Using the internal SSR middleware instead.',
108105
);
106+
109107
fallbackWarningShown = true;
110108
}
111109

@@ -130,10 +128,10 @@ export async function createAngularSsrExternalMiddleware(
130128
}
131129

132130
// Forward the request to the middleware in server.ts
133-
if (isSsrNodeRequestHandler(handler)) {
134-
await handler(req, res, next);
131+
if (isSsrNodeRequestHandler(reqHandler)) {
132+
await reqHandler(req, res, next);
135133
} else {
136-
const webRes = await handler(createWebRequestFromNodeRequest(req));
134+
const webRes = await reqHandler(createWebRequestFromNodeRequest(req));
137135
if (!webRes) {
138136
next();
139137

packages/angular/build/src/utils/server-rendering/launch-server.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,23 @@ export const DEFAULT_URL = new URL('http://ng-localhost/');
2020
* @returns A promise that resolves to the URL of the running server.
2121
*/
2222
export async function launchServer(): Promise<URL> {
23-
const { default: handler } = await loadEsmModuleFromMemory('./server.mjs');
23+
const { reqHandler } = await loadEsmModuleFromMemory('./server.mjs');
2424
const { createWebRequestFromNodeRequest, writeResponseToNodeResponse } =
2525
await loadEsmModule<typeof import('@angular/ssr/node')>('@angular/ssr/node');
2626

27-
if (!isSsrNodeRequestHandler(handler) && !isSsrRequestHandler(handler)) {
27+
if (!isSsrNodeRequestHandler(reqHandler) && !isSsrRequestHandler(reqHandler)) {
2828
return DEFAULT_URL;
2929
}
3030

3131
const server = createServer((req, res) => {
3232
(async () => {
3333
// handle request
34-
if (isSsrNodeRequestHandler(handler)) {
35-
await handler(req, res, (e) => {
34+
if (isSsrNodeRequestHandler(reqHandler)) {
35+
await reqHandler(req, res, (e) => {
3636
throw e;
3737
});
3838
} else {
39-
const webRes = await handler(createWebRequestFromNodeRequest(req));
39+
const webRes = await reqHandler(createWebRequestFromNodeRequest(req));
4040
if (webRes) {
4141
await writeResponseToNodeResponse(webRes, res);
4242
} else {

packages/angular/build/src/utils/server-rendering/load-esm-from-memory.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ interface MainServerBundleExports {
2424
* Represents the exports available from the server bundle.
2525
*/
2626
interface ServerBundleExports {
27-
default: unknown;
27+
reqHandler?: unknown;
2828
}
2929

3030
export function loadEsmModuleFromMemory(

packages/schematics/angular/ssr/files/application-builder/server.ts.template

+28-5
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,21 @@ const browserDistFolder = resolve(serverDistFolder, '../<%= browserDistDirectory
1414
const app = express();
1515
const angularApp = new AngularNodeAppEngine();
1616

17-
// Example Express Rest API endpoints
18-
// app.get('/api/**', (req, res) => { });
17+
/**
18+
* Example Express Rest API endpoints can be defined here.
19+
* Uncomment and define endpoints as necessary.
20+
*
21+
* Example:
22+
* ```ts
23+
* app.get('/api/**', (req, res) => {
24+
* // Handle API request
25+
* });
26+
* ```
27+
*/
1928

20-
// Serve static files from /<%= browserDistDirectory %>
29+
/**
30+
* Serve static files from /<%= browserDistDirectory %>
31+
*/
2132
app.get(
2233
'**',
2334
express.static(browserDistFolder, {
@@ -32,18 +43,30 @@ app.get(
3243
}),
3344
);
3445

46+
/**
47+
* Handle all other requests by rendering the Angular application.
48+
*/
3549
app.get('**', (req, res, next) => {
3650
angularApp
3751
.render(req)
38-
.then((response) => (response ? writeResponseToNodeResponse(response, res) : next()))
52+
.then((response) =>
53+
response ? writeResponseToNodeResponse(response, res) : next(),
54+
)
3955
.catch(next);
4056
});
4157

58+
/**
59+
* Start the server if this module is the main entry point.
60+
* The server listens on the port defined by the `PORT` environment variable, or defaults to 4000.
61+
*/
4262
if (isMainModule(import.meta.url)) {
4363
const port = process.env['PORT'] || 4000;
4464
app.listen(port, () => {
4565
console.log(`Node Express server listening on http://localhost:${port}`);
4666
});
4767
}
4868

49-
export default createNodeRequestHandler(app);
69+
/**
70+
* The request handler used by the Angular CLI (dev-server and during build).
71+
*/
72+
export const reqHandler = createNodeRequestHandler(app);

tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-output-mode-server-platform-neutral.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -82,9 +82,7 @@ export default async function () {
8282
);
8383
8484
app.use(router);
85-
86-
const handler = toWebHandler(app);
87-
export default createRequestHandler(handler);
85+
export const reqHandler = createRequestHandler(toWebHandler(app));
8886
`,
8987
});
9088
// Generate components for the above routes

tests/legacy-cli/e2e/tests/build/server-rendering/server-routes-output-mode-static-http-calls.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ export default async function () {
110110
});
111111
}
112112
113-
export default createNodeRequestHandler(server);
113+
export const reqHandler = createNodeRequestHandler(server);
114114
`,
115115
});
116116

tests/legacy-cli/e2e/tests/vite/ssr-entry-express.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ export default async function () {
7979
});
8080
}
8181
82-
export default createNodeRequestHandler(server);
82+
export const reqHandler = createNodeRequestHandler(server);
8383
`,
8484
});
8585

tests/legacy-cli/e2e/tests/vite/ssr-entry-fastify.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ export default async function () {
7676
});
7777
}
7878
79-
export default createNodeRequestHandler(async (req, res) => {
79+
export const reqHandler = createNodeRequestHandler(async (req, res) => {
8080
await server.ready();
8181
server.server.emit('request', req, res);
8282
});

tests/legacy-cli/e2e/tests/vite/ssr-entry-h3.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -69,8 +69,8 @@ export default async function () {
6969
}
7070
7171
const server = app();
72-
const handler = toWebHandler(server);
73-
export default createRequestHandler(handler);
72+
73+
export const reqHandler = createRequestHandler(toWebHandler(server));
7474
`,
7575
});
7676

tests/legacy-cli/e2e/tests/vite/ssr-entry-hono.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ export default async function () {
6262
}
6363
6464
const server = app();
65-
export default createRequestHandler(server.fetch);
65+
export const reqHandler = createRequestHandler(server.fetch);
6666
`,
6767
});
6868

0 commit comments

Comments
 (0)