diff --git a/package-lock.json b/package-lock.json
index 40857de807..5d8496b4b2 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -4660,12 +4660,14 @@
"balanced-match": {
"version": "1.0.0",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"brace-expansion": {
"version": "1.1.11",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -4680,17 +4682,20 @@
"code-point-at": {
"version": "1.1.0",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"concat-map": {
"version": "0.0.1",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"console-control-strings": {
"version": "1.1.0",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"core-util-is": {
"version": "1.0.2",
@@ -4807,7 +4812,8 @@
"inherits": {
"version": "2.0.3",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"ini": {
"version": "1.3.5",
@@ -4819,6 +4825,7 @@
"version": "1.0.0",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"number-is-nan": "^1.0.0"
}
@@ -4833,6 +4840,7 @@
"version": "3.0.4",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@@ -4840,12 +4848,14 @@
"minimist": {
"version": "0.0.8",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"minipass": {
"version": "2.2.4",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"safe-buffer": "^5.1.1",
"yallist": "^3.0.0"
@@ -4864,6 +4874,7 @@
"version": "0.5.1",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"minimist": "0.0.8"
}
@@ -4944,7 +4955,8 @@
"number-is-nan": {
"version": "1.0.1",
"bundled": true,
- "dev": true
+ "dev": true,
+ "optional": true
},
"object-assign": {
"version": "4.1.1",
@@ -4956,6 +4968,7 @@
"version": "1.4.0",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"wrappy": "1"
}
@@ -5077,6 +5090,7 @@
"version": "1.0.2",
"bundled": true,
"dev": true,
+ "optional": true,
"requires": {
"code-point-at": "^1.0.0",
"is-fullwidth-code-point": "^1.0.0",
diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts
index 134f8cd43e..1727c938e6 100644
--- a/src/app/app-routing.module.ts
+++ b/src/app/app-routing.module.ts
@@ -52,6 +52,7 @@ import { PassportComponent } from './homepage/pages/recipes/passport/passport.co
import { SqlSequelizeComponent } from './homepage/pages/recipes/sql-sequelize/sql-sequelize.component';
import { SqlTypeormComponent } from './homepage/pages/recipes/sql-typeorm/sql-typeorm.component';
import { SwaggerComponent } from './homepage/pages/recipes/swagger/swagger.component';
+import { TerminusComponent } from './homepage/pages/recipes/terminus/terminus.component';
import { SupportComponent } from './homepage/pages/support/support.component';
import { AuthenticationComponent } from './homepage/pages/techniques/authentication/authentication.component';
import { CachingComponent } from './homepage/pages/techniques/caching/caching.component';
@@ -320,6 +321,11 @@ const routes: Routes = [
component: MongodbComponent,
data: { title: 'MongoDB (Mongoose)' },
},
+ {
+ path: 'recipes/terminus',
+ component: TerminusComponent,
+ data: { title: 'Terminus' },
+ },
/*{
path: 'recipes/mockgoose',
component: MockgooseComponent,
@@ -489,4 +495,4 @@ const routes: Routes = [
],
exports: [RouterModule],
})
-export class AppRoutingModule {}
+export class AppRoutingModule { }
diff --git a/src/app/app.module.ts b/src/app/app.module.ts
index 2ec4b82eb7..17e99aa4f5 100644
--- a/src/app/app.module.ts
+++ b/src/app/app.module.ts
@@ -91,6 +91,7 @@ import { CompressionComponent } from './homepage/pages/techniques/compression/co
import { ValidationComponent } from './homepage/pages/techniques/validation/validation.component';
import { CachingComponent } from './homepage/pages/techniques/caching/caching.component';
import { SerializationComponent } from './homepage/pages/techniques/serialization/serialization.component';
+import { TerminusComponent } from './homepage/pages/recipes/terminus/terminus.component';
const DEFAULT_PERFECT_SCROLLBAR_CONFIG: PerfectScrollbarConfigInterface = {
suppressScrollX: true,
@@ -149,6 +150,7 @@ const DEFAULT_PERFECT_SCROLLBAR_CONFIG: PerfectScrollbarConfigInterface = {
MockgooseComponent,
PassportComponent,
SwaggerComponent,
+ TerminusComponent,
CqrsComponent,
TabsComponent,
ExtensionPipe,
diff --git a/src/app/homepage/menu/menu.component.ts b/src/app/homepage/menu/menu.component.ts
index b22138715b..72aba4bc72 100644
--- a/src/app/homepage/menu/menu.component.ts
+++ b/src/app/homepage/menu/menu.component.ts
@@ -139,6 +139,7 @@ export class MenuComponent implements OnInit {
// { title: 'Authentication (Passport)', path: '/recipes/passport' },
{ title: 'CQRS', path: '/recipes/cqrs' },
{ title: 'OpenAPI (Swagger)', path: '/recipes/swagger' },
+ { title: 'Health Checks (Terminus)', path: '/recipes/terminus'}
],
},
{
diff --git a/src/app/homepage/pages/recipes/terminus/terminus.component.html b/src/app/homepage/pages/recipes/terminus/terminus.component.html
new file mode 100644
index 0000000000..9e76d83775
--- /dev/null
+++ b/src/app/homepage/pages/recipes/terminus/terminus.component.html
@@ -0,0 +1,25 @@
+
+
Health Checks (Terminus)
+
+ Godaddys JavaScript library @godaddy/terminus adds graceful shutdown and Kubernetes readiness / liveness checks for any HTTP applications.
+ Therefore it is compatible with NestJS using @nestjs/terminus. Lets get started by installing the required dependencies.
+
+
{{ dependencies }}
+
Health Check
+
+ The first step we need to do is to setup a service, which will handle the health checks.
+
+
health.service.ts
+
{{ healthService }}
+
+ Once we have set up our HealthService
, we can import the TerminusModule
into the root ApplicationModule
.
+ The HealthService
will all provide the settings, which will be used by the TerminusModule
+
+
app.module.ts
+
{{ appModule }}
+
+ Hint
+ If done correctly Nest will expose the defined health check(s), which are reachable through a GET request to the defined route. For example curl -X GET 'http://localhost:3000/health'
+
+
Listen to System Signals (IPC)
+
diff --git a/src/app/homepage/pages/recipes/terminus/terminus.component.ts b/src/app/homepage/pages/recipes/terminus/terminus.component.ts
new file mode 100644
index 0000000000..c0747f9117
--- /dev/null
+++ b/src/app/homepage/pages/recipes/terminus/terminus.component.ts
@@ -0,0 +1,49 @@
+import { Component, ChangeDetectionStrategy } from '@angular/core';
+import { BasePageComponent } from '../../page/page.component';
+
+@Component({
+ selector: 'app-terminus',
+ templateUrl: './terminus.component.html',
+ changeDetection: ChangeDetectionStrategy.OnPush
+})
+export class TerminusComponent extends BasePageComponent {
+ get dependencies() {
+ return `
+$ npm install --save @nestjs/terminus @godaddy/terminus`;
+ }
+
+ get healthService() {
+ return `
+import { Injectable } from '@nestjs/common';
+import { TerminusOptions, TerminusOptionsFactory } from '@nestjs/terminus';
+
+@Injectable()
+export class HealthService implements TerminusOptionsFactory {
+ async health() {
+ return true;
+ }
+
+ async createTerminusOptions(): Promise {
+ return {
+ healthChecks: { '/health': this.health }
+ };
+ }
+}`;
+ }
+
+ get appModule() {
+ return `
+import { Module } from '@nestjs/common';
+import { TerminusModule } from '@nestjs/terminus';
+
+@Module({
+ imports: [
+ TerminusModule.forRootAsync({
+ useClass: TerminusService,
+ }),
+ ],
+})
+export class ApplicationModule {}`;
+ }
+
+}
diff --git a/src/app/homepage/pages/recipes/terminus/terminus.spec.ts b/src/app/homepage/pages/recipes/terminus/terminus.spec.ts
new file mode 100644
index 0000000000..743f23888e
--- /dev/null
+++ b/src/app/homepage/pages/recipes/terminus/terminus.spec.ts
@@ -0,0 +1,24 @@
+import { async, ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { TerminusComponent } from './terminus.component';
+
+describe('TerminusComponent', () => {
+ beforeEach(async(() => {
+ return TestBed.configureTestingModule({
+ declarations: [ TerminusComponent ]
+ })
+ .compileComponents();
+ }));
+
+ let fixture: ComponentFixture;
+ let component: TerminusComponent;
+ beforeEach(() => {
+ fixture = TestBed.createComponent(TerminusComponent);
+ component = fixture.componentInstance;
+ fixture.detectChanges();
+ });
+
+ it('should be created', () => {
+ expect(component).toBeTruthy();
+ });
+});