Browse Source

feat(core): Move error logging to the API Filter layer

Prevents the logging of handled errors.
Michael Bromley 6 years ago
parent
commit
e8fd15db8a

+ 6 - 1
packages/core/src/api/api.module.ts

@@ -1,5 +1,5 @@
 import { Module } from '@nestjs/common';
 import { Module } from '@nestjs/common';
-import { APP_GUARD, APP_INTERCEPTOR } from '@nestjs/core';
+import { APP_FILTER, APP_GUARD, APP_INTERCEPTOR } from '@nestjs/core';
 import path from 'path';
 import path from 'path';
 
 
 import { DataImportModule } from '../data-import/data-import.module';
 import { DataImportModule } from '../data-import/data-import.module';
@@ -9,6 +9,7 @@ import { AdminApiModule, ApiSharedModule, ShopApiModule } from './api-internal-m
 import { RequestContextService } from './common/request-context.service';
 import { RequestContextService } from './common/request-context.service';
 import { configureGraphQLModule } from './config/configure-graphql-module';
 import { configureGraphQLModule } from './config/configure-graphql-module';
 import { AuthGuard } from './middleware/auth-guard';
 import { AuthGuard } from './middleware/auth-guard';
+import { ExceptionLoggerFilter } from './middleware/exception-logger.filter';
 import { IdInterceptor } from './middleware/id-interceptor';
 import { IdInterceptor } from './middleware/id-interceptor';
 import { ValidateCustomFieldsInterceptor } from './middleware/validate-custom-fields-interceptor';
 import { ValidateCustomFieldsInterceptor } from './middleware/validate-custom-fields-interceptor';
 
 
@@ -55,6 +56,10 @@ import { ValidateCustomFieldsInterceptor } from './middleware/validate-custom-fi
             provide: APP_INTERCEPTOR,
             provide: APP_INTERCEPTOR,
             useClass: ValidateCustomFieldsInterceptor,
             useClass: ValidateCustomFieldsInterceptor,
         },
         },
+        {
+            provide: APP_FILTER,
+            useClass: ExceptionLoggerFilter,
+        },
     ],
     ],
 })
 })
 export class ApiModule {}
 export class ApiModule {}

+ 3 - 0
packages/core/src/api/index.ts

@@ -2,3 +2,6 @@ export * from './common/request-context';
 export * from './decorators/allow.decorator';
 export * from './decorators/allow.decorator';
 export * from './decorators/request-context.decorator';
 export * from './decorators/request-context.decorator';
 export * from './resolvers/admin/search.resolver';
 export * from './resolvers/admin/search.resolver';
+export * from './middleware/auth-guard';
+export * from './middleware/exception-logger.filter';
+export * from './middleware/id-interceptor';

+ 33 - 0
packages/core/src/api/middleware/exception-logger.filter.ts

@@ -0,0 +1,33 @@
+import { ArgumentsHost, ExceptionFilter } from '@nestjs/common';
+
+import { Logger, LogLevel } from '../../config';
+import { I18nError } from '../../i18n/i18n-error';
+
+/**
+ * Logs thrown I18nErrors via the configured VendureLogger.
+ */
+export class ExceptionLoggerFilter implements ExceptionFilter {
+    catch(exception: Error, host: ArgumentsHost) {
+        if (exception instanceof I18nError) {
+            const { code, message, logLevel } = exception;
+            const logMessage = `BOBBY ${code || 'Error'}: ${message}`;
+            switch (logLevel) {
+                case LogLevel.Error:
+                    Logger.error(logMessage, undefined, exception.stack);
+                    break;
+                case LogLevel.Warn:
+                    Logger.warn(logMessage);
+                    break;
+                case LogLevel.Info:
+                    Logger.info(logMessage);
+                    break;
+                case LogLevel.Debug:
+                    Logger.debug(logMessage);
+                    break;
+                case LogLevel.Verbose:
+                    Logger.verbose(logMessage);
+                    break;
+            }
+        }
+    }
+}

+ 3 - 21
packages/core/src/i18n/i18n-error.ts

@@ -1,6 +1,6 @@
 import { ApolloError } from 'apollo-server-core';
 import { ApolloError } from 'apollo-server-core';
 
 
-import { Logger, LogLevel } from '../config/logger/vendure-logger';
+import { LogLevel } from '../config/logger/vendure-logger';
 
 
 /**
 /**
  * @description
  * @description
@@ -19,27 +19,9 @@ export abstract class I18nError extends ApolloError {
     protected constructor(
     protected constructor(
         public message: string,
         public message: string,
         public variables: { [key: string]: string | number } = {},
         public variables: { [key: string]: string | number } = {},
-        code?: string,
-        logLevel: LogLevel = LogLevel.Warn,
+        public code?: string,
+        public logLevel: LogLevel = LogLevel.Warn,
     ) {
     ) {
         super(message, code);
         super(message, code);
-        const logMessage = `${code || 'Error'}: ${message}`;
-        switch (logLevel) {
-            case LogLevel.Error:
-                Logger.error(logMessage, undefined, this.stack);
-                break;
-            case LogLevel.Warn:
-                Logger.warn(logMessage);
-                break;
-            case LogLevel.Info:
-                Logger.info(logMessage);
-                break;
-            case LogLevel.Debug:
-                Logger.debug(logMessage);
-                break;
-            case LogLevel.Verbose:
-                Logger.verbose(logMessage);
-                break;
-        }
     }
     }
 }
 }