Skip to content

Commit 17a609c

Browse files
feature(@nestjs/microservices) grpc improvements (add root), cleanup
1 parent ae128f6 commit 17a609c

31 files changed

Lines changed: 173 additions & 288 deletions

packages/common/decorators/core/reflect-metadata.decorator.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/**
2-
* Assigns the metadata to the class / function under specified `key`.
2+
* Assigns the metadata to the class/function under specified `key`.
33
* This metadata can be reflected using `Reflector` class.
44
*/
55
export const ReflectMetadata = (metadataKey, metadataValue) => (

packages/common/interfaces/external/validator-options.interface.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,8 @@ export interface ValidatorOptions {
3939
*/
4040
value?: boolean;
4141
};
42+
/**
43+
* Settings true will cause fail validation of unknown objects.
44+
*/
45+
forbidUnknownValues?: boolean;
4246
}

packages/common/interfaces/microservices/microservice-configuration.interface.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Transport } from '../../enums/transport.enum';
2-
import { CustomTransportStrategy } from './custom-transport-strategy.interface';
32
import { MqttClientOptions } from '../external/mqtt-options.interface';
3+
import { CustomTransportStrategy } from './custom-transport-strategy.interface';
44

55
export type MicroserviceOptions =
66
| GrpcOptions
@@ -21,6 +21,7 @@ export interface GrpcOptions {
2121
url?: string;
2222
credentials?: any;
2323
protoPath: string;
24+
root?: string;
2425
package: string;
2526
};
2627
}

packages/core/errors/messages.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ export const InvalidModuleMessage = (scope: string) =>
2121
`Nest cannot create the module instance. The frequent reason of this exception is the circular dependency between modules. Use forwardRef() to avoid it (read more https://docs.nestjs.com/advanced/circular-dependency). Scope [${scope}]`;
2222

2323
export const UnknownExportMessage = (module: string) =>
24-
`Nest cannot export component / module that is not a part of the currently proccessed module (${module}). Please verify whether each exported unit is available in this particular context.`;
24+
`Nest cannot export component/module that is not a part of the currently proccessed module (${module}). Please verify whether each exported unit is available in this particular context.`;
2525

2626
export const INVALID_MIDDLEWARE_CONFIGURATION = `Invalid middleware configuration passed inside the module 'configure()' method.`;
2727
export const UNKNOWN_REQUEST_MAPPING = `Request mapping properties not defined in the @RequestMapping() annotation!`;

packages/core/exceptions/exceptions-handler.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
import { messages } from '../constants';
2-
import { Logger, HttpServer } from '@nestjs/common';
1+
import { HttpException, HttpServer, Logger } from '@nestjs/common';
32
import { ExceptionFilterMetadata } from '@nestjs/common/interfaces/exceptions/exception-filter-metadata.interface';
3+
import { ArgumentsHost } from '@nestjs/common/interfaces/features/arguments-host.interface';
44
import { isEmpty, isObject } from '@nestjs/common/utils/shared.utils';
5+
import { messages } from '../constants';
56
import { InvalidExceptionFilterException } from '../errors/exceptions/invalid-exception-filter.exception';
6-
import { HttpException } from '@nestjs/common';
7-
import { ArgumentsHost } from '@nestjs/common/interfaces/features/arguments-host.interface';
87

98
export class ExceptionsHandler {
109
private static readonly logger = new Logger(ExceptionsHandler.name);
@@ -20,8 +19,7 @@ export class ExceptionsHandler {
2019
statusCode: 500,
2120
message: messages.UNKNOWN_EXCEPTION_MESSAGE,
2221
};
23-
const statusCode = 500;
24-
this.applicationRef.reply(ctx.getArgByIndex(1), body, statusCode);
22+
this.applicationRef.reply(ctx.getArgByIndex(1), body, body.statusCode);
2523
if (this.isExceptionObject(exception)) {
2624
return ExceptionsHandler.logger.error(
2725
exception.message,

packages/core/injector/module.ts

Lines changed: 9 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,17 @@
1-
import { InstanceWrapper, NestContainer } from './container';
2-
import {
3-
Injectable,
4-
Controller,
5-
NestModule,
6-
DynamicModule,
7-
} from '@nestjs/common/interfaces';
8-
import { UnknownExportException } from '../errors/exceptions/unknown-export.exception';
1+
import { Controller, DynamicModule, Injectable, NestModule } from '@nestjs/common/interfaces';
92
import { Type } from '@nestjs/common/interfaces/type.interface';
10-
import { ModuleRef } from './module-ref';
11-
import {
12-
isFunction,
13-
isNil,
14-
isUndefined,
15-
isString,
16-
isSymbol,
17-
} from '@nestjs/common/utils/shared.utils';
3+
import { isFunction, isNil, isString, isSymbol, isUndefined } from '@nestjs/common/utils/shared.utils';
184
import { RuntimeException } from '../errors/exceptions/runtime.exception';
19-
import { ExternalContextCreator } from './../helpers/external-context-creator';
5+
import { UnknownExportException } from '../errors/exceptions/unknown-export.exception';
6+
import { Reflector } from '../services/reflector.service';
7+
import { GuardsConsumer } from './../guards/guards-consumer';
208
import { GuardsContextCreator } from './../guards/guards-context-creator';
21-
import { InterceptorsContextCreator } from './../interceptors/interceptors-context-creator';
9+
import { ExternalContextCreator } from './../helpers/external-context-creator';
2210
import { InterceptorsConsumer } from './../interceptors/interceptors-consumer';
23-
import { GuardsConsumer } from './../guards/guards-consumer';
11+
import { InterceptorsContextCreator } from './../interceptors/interceptors-context-creator';
12+
import { InstanceWrapper, NestContainer } from './container';
13+
import { ModuleRef } from './module-ref';
2414
import { ModulesContainer } from './modules-container';
25-
import { Reflector } from '../services/reflector.service';
2615
import { HTTP_SERVER_REF } from './tokens';
2716

2817
export interface CustomComponent {

packages/core/middleware/middleware-module.ts

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,30 @@
1-
import { NestContainer } from '../injector/container';
2-
import { MiddlewareBuilder } from './builder';
3-
import { MiddlewareContainer, MiddlewareWrapper } from './container';
4-
import { MiddlewareResolver } from './resolver';
5-
import { ControllerMetadata } from '@nestjs/common/interfaces/controllers/controller-metadata.interface';
6-
import { NestModule } from '@nestjs/common/interfaces/modules/nest-module.interface';
7-
import { MiddlewareConfiguration } from '@nestjs/common/interfaces/middleware/middleware-configuration.interface';
8-
import { InvalidMiddlewareException } from '../errors/exceptions/invalid-middleware.exception';
91
import { RequestMethod } from '@nestjs/common/enums/request-method.enum';
10-
import { RoutesMapper } from './routes-mapper';
11-
import { RouterProxy } from '../router/router-proxy';
12-
import { ExceptionsHandler } from '../exceptions/exceptions-handler';
13-
import { Module } from '../injector/module';
14-
import { RouterMethodFactory } from '../helpers/router-method-factory';
2+
import { MiddlewareConfiguration } from '@nestjs/common/interfaces/middleware/middleware-configuration.interface';
153
import { NestMiddleware } from '@nestjs/common/interfaces/middleware/nest-middleware.interface';
4+
import { NestModule } from '@nestjs/common/interfaces/modules/nest-module.interface';
165
import { Type } from '@nestjs/common/interfaces/type.interface';
17-
import { RuntimeException } from '../errors/exceptions/runtime.exception';
18-
import { isUndefined } from '@nestjs/common/utils/shared.utils';
6+
import { isUndefined, validatePath } from '@nestjs/common/utils/shared.utils';
197
import { ApplicationConfig } from '../application-config';
8+
import { InvalidMiddlewareException } from '../errors/exceptions/invalid-middleware.exception';
9+
import { RuntimeException } from '../errors/exceptions/runtime.exception';
10+
import { ExceptionsHandler } from '../exceptions/exceptions-handler';
11+
import { RouterMethodFactory } from '../helpers/router-method-factory';
12+
import { NestContainer } from '../injector/container';
13+
import { Module } from '../injector/module';
2014
import { RouterExceptionFilters } from '../router/router-exception-filters';
15+
import { RouterProxy } from '../router/router-proxy';
16+
import { MiddlewareBuilder } from './builder';
17+
import { MiddlewareContainer, MiddlewareWrapper } from './container';
18+
import { MiddlewareResolver } from './resolver';
19+
import { RoutesMapper } from './routes-mapper';
2120

2221
export class MiddlewareModule {
2322
private readonly routerProxy = new RouterProxy();
2423
private readonly routerMethodFactory = new RouterMethodFactory();
2524
private routerExceptionFilter: RouterExceptionFilters;
2625
private routesMapper: RoutesMapper;
2726
private resolver: MiddlewareResolver;
27+
private config: ApplicationConfig;
2828

2929
public async register(
3030
middlewareContainer: MiddlewareContainer,
@@ -39,6 +39,7 @@ export class MiddlewareModule {
3939
);
4040
this.routesMapper = new RoutesMapper(container);
4141
this.resolver = new MiddlewareResolver(middlewareContainer);
42+
this.config = config;
4243

4344
const modules = container.getModules();
4445
await this.resolveMiddleware(middlewareContainer, modules);
@@ -184,6 +185,8 @@ export class MiddlewareModule {
184185
path: string,
185186
) {
186187
const proxy = this.routerProxy.createProxy(middleware, exceptionsHandler);
187-
router(path, proxy);
188+
const prefix = this.config.getGlobalPrefix();
189+
const basePath = prefix ? validatePath(prefix) : '';
190+
router(basePath + path, proxy);
188191
}
189192
}

packages/core/nest-application.ts

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,46 @@
1-
import * as cors from 'cors';
2-
import * as http from 'http';
3-
import * as https from 'https';
4-
import * as optional from 'optional';
5-
import * as bodyParser from 'body-parser';
6-
import iterate from 'iterare';
71
import {
82
CanActivate,
93
ExceptionFilter,
4+
INestApplication,
5+
INestMicroservice,
106
NestInterceptor,
117
OnModuleDestroy,
128
PipeTransform,
139
WebSocketAdapter,
1410
} from '@nestjs/common';
15-
import {
16-
INestApplication,
17-
INestMicroservice,
18-
OnModuleInit,
19-
} from '@nestjs/common';
11+
import { HttpServer } from '@nestjs/common/interfaces';
12+
import { CorsOptions } from '@nestjs/common/interfaces/external/cors-options.interface';
13+
import { ServeStaticOptions } from '@nestjs/common/interfaces/external/serve-static-options.interface';
14+
import { MicroserviceOptions } from '@nestjs/common/interfaces/microservices/microservice-configuration.interface';
15+
import { NestApplicationOptions } from '@nestjs/common/interfaces/nest-application-options.interface';
16+
import { INestExpressApplication } from '@nestjs/common/interfaces/nest-express-application.interface';
17+
import { INestFastifyApplication } from '@nestjs/common/interfaces/nest-fastify-application.interface';
2018
import { Logger } from '@nestjs/common/services/logger.service';
19+
import { loadPackage } from '@nestjs/common/utils/load-package.util';
2120
import {
21+
isFunction,
2222
isNil,
23+
isObject,
2324
isUndefined,
2425
validatePath,
25-
isFunction,
26-
isObject,
2726
} from '@nestjs/common/utils/shared.utils';
28-
import { MicroserviceOptions } from '@nestjs/common/interfaces/microservices/microservice-configuration.interface';
27+
import * as bodyParser from 'body-parser';
28+
import * as cors from 'cors';
29+
import * as http from 'http';
30+
import * as https from 'https';
31+
import iterate from 'iterare';
32+
import * as optional from 'optional';
33+
import { ExpressAdapter } from './adapters/express-adapter';
34+
import { FastifyAdapter } from './adapters/fastify-adapter';
2935
import { ApplicationConfig } from './application-config';
3036
import { messages } from './constants';
3137
import { NestContainer } from './injector/container';
3238
import { Module } from './injector/module';
39+
import { MiddlewareContainer } from './middleware/container';
3340
import { MiddlewareModule } from './middleware/middleware-module';
41+
import { NestApplicationContext } from './nest-application-context';
3442
import { Resolver } from './router/interfaces/resolver.interface';
3543
import { RoutesResolver } from './router/routes-resolver';
36-
import { MiddlewareContainer } from './middleware/container';
37-
import { NestApplicationContext } from './nest-application-context';
38-
import { HttpsOptions } from '@nestjs/common/interfaces/external/https-options.interface';
39-
import { NestApplicationOptions } from '@nestjs/common/interfaces/nest-application-options.interface';
40-
import { CorsOptions } from '@nestjs/common/interfaces/external/cors-options.interface';
41-
import { HttpServer } from '@nestjs/common/interfaces';
42-
import { ExpressAdapter } from './adapters/express-adapter';
43-
import { FastifyAdapter } from './adapters/fastify-adapter';
44-
import { INestExpressApplication } from '@nestjs/common/interfaces/nest-express-application.interface';
45-
import { INestFastifyApplication } from '@nestjs/common/interfaces/nest-fastify-application.interface';
46-
import { ServeStaticOptions } from '@nestjs/common/interfaces/external/serve-static-options.interface';
47-
import { loadPackage } from '@nestjs/common/utils/load-package.util';
4844

4945
const { SocketModule } =
5046
optional('@nestjs/websockets/socket-module') || ({} as any);

packages/core/router/router-exception-filters.ts

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,13 @@
1-
import 'reflect-metadata';
2-
import iterate from 'iterare';
1+
import { HttpServer } from '@nestjs/common';
2+
import { EXCEPTION_FILTERS_METADATA } from '@nestjs/common/constants';
33
import { Controller } from '@nestjs/common/interfaces/controllers/controller.interface';
4-
import { ExceptionsHandler } from '../exceptions/exceptions-handler';
5-
import {
6-
EXCEPTION_FILTERS_METADATA,
7-
FILTER_CATCH_EXCEPTIONS,
8-
} from '@nestjs/common/constants';
9-
import {
10-
isEmpty,
11-
isFunction,
12-
isUndefined,
13-
} from '@nestjs/common/utils/shared.utils';
14-
import { Type } from '@nestjs/common/interfaces/index';
15-
import { ExceptionFilterMetadata } from '@nestjs/common/interfaces/exceptions/exception-filter-metadata.interface';
16-
import { ExceptionFilter } from '@nestjs/common/interfaces/exceptions/exception-filter.interface';
17-
import { RouterProxyCallback } from './../router/router-proxy';
18-
import { ApplicationConfig } from './../application-config';
4+
import { isEmpty } from '@nestjs/common/utils/shared.utils';
5+
import 'reflect-metadata';
196
import { BaseExceptionFilterContext } from '../exceptions/base-exception-filter-context';
20-
import { HttpServer } from '@nestjs/common';
7+
import { ExceptionsHandler } from '../exceptions/exceptions-handler';
218
import { NestContainer } from '../injector/container';
9+
import { ApplicationConfig } from './../application-config';
10+
import { RouterProxyCallback } from './../router/router-proxy';
2211

2312
export class RouterExceptionFilters extends BaseExceptionFilterContext {
2413
constructor(
@@ -45,7 +34,7 @@ export class RouterExceptionFilters extends BaseExceptionFilterContext {
4534
if (isEmpty(filters)) {
4635
return exceptionHandler;
4736
}
48-
exceptionHandler.setCustomFilters(filters);
37+
exceptionHandler.setCustomFilters(filters.reverse());
4938
return exceptionHandler;
5039
}
5140

packages/core/test/middlewares/middlewares-module.spec.ts

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
11
import { expect } from 'chai';
22
import * as sinon from 'sinon';
3-
import { NestMiddleware } from '../../../common/interfaces/middleware/nest-middleware.interface';
43
import { Component } from '../../../common/decorators/core/component.decorator';
5-
import { MiddlewareBuilder } from '../../middleware/builder';
6-
import { MiddlewareModule } from '../../middleware/middleware-module';
7-
import { InvalidMiddlewareException } from '../../errors/exceptions/invalid-middleware.exception';
8-
import { RequestMethod } from '../../../common/enums/request-method.enum';
94
import { Controller } from '../../../common/decorators/core/controller.decorator';
105
import { RequestMapping } from '../../../common/decorators/http/request-mapping.decorator';
11-
import { RuntimeException } from '../../errors/exceptions/runtime.exception';
12-
import { RoutesMapper } from '../../middleware/routes-mapper';
13-
import { RouterExceptionFilters } from '../../router/router-exception-filters';
14-
import { ApplicationConfig } from '../../application-config';
15-
import { MiddlewareContainer } from '../../middleware/container';
6+
import { RequestMethod } from '../../../common/enums/request-method.enum';
7+
import { NestMiddleware } from '../../../common/interfaces/middleware/nest-middleware.interface';
168
import { ExpressAdapter } from '../../adapters/express-adapter';
9+
import { ApplicationConfig } from '../../application-config';
10+
import { InvalidMiddlewareException } from '../../errors/exceptions/invalid-middleware.exception';
11+
import { RuntimeException } from '../../errors/exceptions/runtime.exception';
1712
import { NestContainer } from '../../injector/container';
13+
import { MiddlewareBuilder } from '../../middleware/builder';
14+
import { MiddlewareContainer } from '../../middleware/container';
15+
import { MiddlewareModule } from '../../middleware/middleware-module';
16+
import { RouterExceptionFilters } from '../../router/router-exception-filters';
1817

1918
describe('MiddlewareModule', () => {
2019
let middlewareModule: MiddlewareModule;
@@ -39,12 +38,14 @@ describe('MiddlewareModule', () => {
3938
}
4039

4140
beforeEach(() => {
41+
const appConfig = new ApplicationConfig();
4242
middlewareModule = new MiddlewareModule();
4343
(middlewareModule as any).routerExceptionFilter = new RouterExceptionFilters(
4444
new NestContainer(),
45-
new ApplicationConfig(),
45+
appConfig,
4646
new ExpressAdapter({}),
4747
);
48+
(middlewareModule as any).config = appConfig;
4849
});
4950

5051
describe('loadConfiguration', () => {

0 commit comments

Comments
 (0)