Skip to content
This repository was archived by the owner on Nov 22, 2024. It is now read-only.

Commit fcee6ff

Browse files
vikermanCaerusKaru
authored andcommitted
fix(hapi-engine, express-engine): export app for serverless functions (#1249)
Export Hapi and Express app from the server bundle so that they can be referenced in serverless functions if needed.
1 parent b3e1461 commit fcee6ff

File tree

6 files changed

+121
-84
lines changed

6 files changed

+121
-84
lines changed

integration/express-engine-ivy/server.ts

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,40 @@ import { join } from 'path';
77
import { AppServerModule } from './src/main.server';
88

99
// The Express app is exported so that it can be used by serverless Functions.
10-
export const app = express();
11-
const distFolder = join(process.cwd(), 'dist/express-engine-ivy/browser');
12-
13-
// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine)
14-
app.engine('html', ngExpressEngine({
15-
bootstrap: AppServerModule,
16-
}));
17-
18-
app.set('view engine', 'html');
19-
app.set('views', distFolder);
20-
21-
// Example Express Rest API endpoints
22-
// app.get('/api/**', (req, res) => { });
23-
// Serve static files from /browser
24-
app.get('*.*', express.static(distFolder, {
25-
maxAge: '1y'
26-
}));
10+
export function app() {
11+
const server = express();
12+
const distFolder = join(process.cwd(), 'dist/express-engine-ivy/browser');
13+
14+
// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine)
15+
server.engine('html', ngExpressEngine({
16+
bootstrap: AppServerModule,
17+
}));
18+
19+
server.set('view engine', 'html');
20+
server.set('views', distFolder);
21+
22+
// Example Express Rest API endpoints
23+
// app.get('/api/**', (req, res) => { });
24+
// Serve static files from /browser
25+
server.get('*.*', express.static(distFolder, {
26+
maxAge: '1y'
27+
}));
28+
29+
// All regular routes use the Universal engine
30+
server.get('*', (req, res) => {
31+
res.render('index', { req });
32+
});
2733

28-
// All regular routes use the Universal engine
29-
app.get('*', (req, res) => {
30-
res.render('index', { req });
31-
});
34+
return server;
35+
}
3236

3337
// Express server
3438
function run() {
35-
// Start up the Node server
3639
const port: string | number = process.env.PORT || 4000;
37-
app.listen(port, () => {
40+
41+
// Start up the Node server
42+
const server = app();
43+
server.listen(port, () => {
3844
console.log(`Node Express server listening on http://localhost:${port}`);
3945
});
4046
}

integration/express-engine-ve/server.ts

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,40 @@ import { join } from 'path';
77
import { AppServerModuleNgFactory } from './src/main.server';
88

99
// The Express app is exported so that it can be used by serverless Functions.
10-
export const app = express();
11-
const distFolder = join(process.cwd(), 'dist/express-engine-ve/browser');
12-
13-
// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine)
14-
app.engine('html', ngExpressEngine({
15-
bootstrap: AppServerModuleNgFactory,
16-
}));
17-
18-
app.set('view engine', 'html');
19-
app.set('views', distFolder);
20-
21-
// Example Express Rest API endpoints
22-
// app.get('/api/**', (req, res) => { });
23-
// Serve static files from /browser
24-
app.get('*.*', express.static(distFolder, {
25-
maxAge: '1y'
26-
}));
10+
export function app() {
11+
const server = express();
12+
const distFolder = join(process.cwd(), 'dist/express-engine-ve/browser');
13+
14+
// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine)
15+
server.engine('html', ngExpressEngine({
16+
bootstrap: AppServerModuleNgFactory,
17+
}));
18+
19+
server.set('view engine', 'html');
20+
server.set('views', distFolder);
21+
22+
// Example Express Rest API endpoints
23+
// app.get('/api/**', (req, res) => { });
24+
// Serve static files from /browser
25+
server.get('*.*', express.static(distFolder, {
26+
maxAge: '1y'
27+
}));
28+
29+
// All regular routes use the Universal engine
30+
server.get('*', (req, res) => {
31+
res.render('index', { req });
32+
});
2733

28-
// All regular routes use the Universal engine
29-
app.get('*', (req, res) => {
30-
res.render('index', { req });
31-
});
34+
return server;
35+
}
3236

3337
// Express server
3438
function run() {
35-
// Start up the Node server
3639
const port: string | number = process.env.PORT || 4000;
37-
app.listen(port, () => {
40+
41+
// Start up the Node server
42+
const server = app();
43+
server.listen(port, () => {
3844
console.log(`Node Express server listening on http://localhost:${port}`);
3945
});
4046
}

integration/hapi-engine-ivy/server.ts

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,16 @@ import { ngHapiEngine } from '@nguniversal/hapi-engine';
44
import * as inert from 'inert';
55
import { Request, Server, ResponseToolkit } from 'hapi';
66
import { join } from 'path';
7+
import { readFileSync } from 'fs';
78

89
import { AppServerModule } from './src/main.server';
9-
import { readFileSync } from 'fs';
1010

11-
// Hapi server
12-
async function run(): Promise<void> {
11+
// The Hapi server is exported so that it can be used by serverless functions.
12+
export async function app() {
1313
const port: string | number = process.env.PORT || 4000;
1414
const distFolder = join(process.cwd(), 'dist/hapi-engine-ivy/browser');
1515
const server = new Server({
1616
port,
17-
host: 'localhost',
1817
routes: {
1918
files: {
2019
relativeTo: distFolder
@@ -44,8 +43,13 @@ async function run(): Promise<void> {
4443
res.file(`${req.params.filename}.${req.params.ext}`)
4544
});
4645

46+
return server;
47+
}
48+
49+
async function run(): Promise<void> {
50+
const server = await app();
4751
await server.start();
48-
console.log(`Node Hapi server listening on http://localhost:${port}`);
52+
console.log(`Node Hapi server listening on http://${server.info.host}:${server.info.port}`);
4953
}
5054

5155
// Webpack will replace 'require' with '__webpack_require__'
@@ -54,7 +58,10 @@ async function run(): Promise<void> {
5458
declare const __non_webpack_require__: NodeRequire;
5559
const mainModule = __non_webpack_require__.main;
5660
if (mainModule && mainModule.filename === __filename) {
57-
run();
61+
run().catch(error => {
62+
console.error(`Error: ${error.toString()}`);
63+
process.exit(1);
64+
});
5865
}
5966

6067
export * from './src/main.server';

integration/hapi-engine-ve/server.ts

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,15 @@ import * as inert from 'inert';
55
import { Request, Server, ResponseToolkit } from 'hapi';
66
import { join } from 'path';
77
import { readFileSync } from 'fs';
8+
89
import { AppServerModuleNgFactory } from './src/main.server';
910

10-
// Hapi server
11-
async function run(): Promise<void> {
11+
// The Hapi server is exported so that it can be used by serverless functions.
12+
export async function app() {
1213
const port: string | number = process.env.PORT || 4000;
1314
const distFolder = join(process.cwd(), 'dist/hapi-engine-ve/browser');
1415
const server = new Server({
1516
port,
16-
host: 'localhost',
1717
routes: {
1818
files: {
1919
relativeTo: distFolder
@@ -43,8 +43,13 @@ async function run(): Promise<void> {
4343
res.file(`${req.params.filename}.${req.params.ext}`)
4444
});
4545

46+
return server;
47+
}
48+
49+
async function run(): Promise<void> {
50+
const server = await app();
4651
await server.start();
47-
console.log(`Node Hapi server listening on http://localhost:${port}`);
52+
console.log(`Node Hapi server listening on http://${server.info.host}:${server.info.port}`);
4853
}
4954

5055
// Webpack will replace 'require' with '__webpack_require__'
@@ -53,7 +58,10 @@ async function run(): Promise<void> {
5358
declare const __non_webpack_require__: NodeRequire;
5459
const mainModule = __non_webpack_require__.main;
5560
if (mainModule && mainModule.filename === __filename) {
56-
run();
61+
run().catch(error => {
62+
console.error(`Error: ${error.toString()}`);
63+
process.exit(1);
64+
});
5765
}
5866

5967
export * from './src/main.server';

modules/express-engine/schematics/install/files/__serverFileName@stripTsExtension__.ts

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,34 +7,40 @@ import { join } from 'path';
77
import { AppServerModule } from './src/<%= stripTsExtension(main) %>';
88

99
// The Express app is exported so that it can be used by serverless Functions.
10-
export const app = express();
11-
const distFolder = join(process.cwd(), '<%= browserDistDirectory %>');
12-
13-
// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine)
14-
app.engine('html', ngExpressEngine({
15-
bootstrap: AppServerModule,
16-
}));
17-
18-
app.set('view engine', 'html');
19-
app.set('views', distFolder);
20-
21-
// Example Express Rest API endpoints
22-
// app.get('/api/**', (req, res) => { });
23-
// Serve static files from /browser
24-
app.get('*.*', express.static(distFolder, {
25-
maxAge: '1y'
26-
}));
10+
export function app() {
11+
const server = express();
12+
const distFolder = join(process.cwd(), '<%= browserDistDirectory %>');
13+
14+
// Our Universal express-engine (found @ https://github.com/angular/universal/tree/master/modules/express-engine)
15+
server.engine('html', ngExpressEngine({
16+
bootstrap: AppServerModule,
17+
}));
18+
19+
server.set('view engine', 'html');
20+
server.set('views', distFolder);
21+
22+
// Example Express Rest API endpoints
23+
// app.get('/api/**', (req, res) => { });
24+
// Serve static files from /browser
25+
server.get('*.*', express.static(distFolder, {
26+
maxAge: '1y'
27+
}));
28+
29+
// All regular routes use the Universal engine
30+
server.get('*', (req, res) => {
31+
res.render('index', { req });
32+
});
2733

28-
// All regular routes use the Universal engine
29-
app.get('*', (req, res) => {
30-
res.render('index', { req });
31-
});
34+
return server;
35+
}
3236

3337
// Express server
3438
function run() {
35-
// Start up the Node server
3639
const port: string | number = process.env.PORT || <%= serverPort %>;
37-
app.listen(port, () => {
40+
41+
// Start up the Node server
42+
const server = app();
43+
server.listen(port, () => {
3844
console.log(`Node Express server listening on http://localhost:${port}`);
3945
});
4046
}

modules/hapi-engine/schematics/install/files/__serverFileName@stripTsExtension__.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,12 @@ import { readFileSync } from 'fs';
88

99
import { AppServerModule } from './src/<%= stripTsExtension(main) %>';
1010

11-
// Hapi server
12-
async function run(): Promise<void> {
11+
// The Hapi server is exported so that it can be used by serverless functions.
12+
export async function app() {
1313
const port: string | number = process.env.PORT || <%= serverPort %>;
1414
const distFolder = join(process.cwd(), '<%= browserDistDirectory %>');
1515
const server = new Server({
1616
port,
17-
host: 'localhost',
1817
routes: {
1918
files: {
2019
relativeTo: distFolder
@@ -44,8 +43,13 @@ async function run(): Promise<void> {
4443
res.file(`${req.params.filename}.${req.params.ext}`)
4544
});
4645

46+
return server;
47+
}
48+
49+
async function run(): Promise<void> {
50+
const server = await app();
4751
await server.start();
48-
console.log(`Node Hapi server listening on http://localhost:${port}`);
52+
console.log(`Node Hapi server listening on http://${server.info.host}:${server.info.port}`);
4953
}
5054

5155
// Webpack will replace 'require' with '__webpack_require__'

0 commit comments

Comments
 (0)