mirror of
https://github.com/nestjs/nest.git
synced 2026-02-21 23:11:44 +00:00
feature(): use metadata cache for headers and status code
This commit is contained in:
@@ -30,8 +30,7 @@ export class TransformInterceptor {
|
||||
|
||||
@Injectable()
|
||||
export class StatusInterceptor {
|
||||
|
||||
constructor(private statusCode: number){}
|
||||
constructor(private statusCode: number) {}
|
||||
|
||||
intercept(context: ExecutionContext, next: CallHandler) {
|
||||
const ctx = context.switchToHttp();
|
||||
@@ -43,8 +42,7 @@ export class StatusInterceptor {
|
||||
|
||||
@Injectable()
|
||||
export class HeaderInterceptor {
|
||||
|
||||
constructor(private headers: object){}
|
||||
constructor(private headers: object) {}
|
||||
|
||||
intercept(context: ExecutionContext, next: CallHandler) {
|
||||
const ctx = context.switchToHttp();
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { HelloService } from './hello.service';
|
||||
import { Controller, Get, Header, Param, Post } from '@nestjs/common';
|
||||
import { Controller, Get, Header, Param } from '@nestjs/common';
|
||||
import { Observable, of } from 'rxjs';
|
||||
import { HelloService } from './hello.service';
|
||||
import { UserByIdPipe } from './users/user-by-id.pipe';
|
||||
|
||||
@Controller('hello')
|
||||
|
||||
@@ -7,6 +7,9 @@ export const HANDLER_METADATA_SYMBOL = Symbol.for('handler_metadata:cache');
|
||||
export interface HandlerMetadata {
|
||||
argsLength: number;
|
||||
paramtypes: any[];
|
||||
httpStatusCode: number;
|
||||
responseHeaders: any[];
|
||||
hasCustomHeaders: boolean;
|
||||
getParamsMetadata: (
|
||||
moduleKey: string,
|
||||
contextId?: ContextId,
|
||||
|
||||
@@ -83,7 +83,11 @@ export class RouterExecutionContext {
|
||||
fnHandleResponse,
|
||||
paramtypes,
|
||||
getParamsMetadata,
|
||||
} = this.getMetadata(instance, callback, methodName, module);
|
||||
httpStatusCode,
|
||||
responseHeaders,
|
||||
hasCustomHeaders,
|
||||
} = this.getMetadata(instance, callback, methodName, module, requestMethod);
|
||||
|
||||
const paramsOptions = this.contextUtils.mergeParamsMetatypes(
|
||||
getParamsMetadata(module, contextId, inquirerId),
|
||||
paramtypes,
|
||||
@@ -131,17 +135,7 @@ export class RouterExecutionContext {
|
||||
const args = this.contextUtils.createNullArray(argsLength);
|
||||
fnCanActivate && (await fnCanActivate([req, res]));
|
||||
|
||||
const httpCode = this.reflectHttpStatusCode(callback);
|
||||
|
||||
const httpStatusCode = httpCode
|
||||
? httpCode
|
||||
: this.responseController.getStatusByMethod(requestMethod);
|
||||
|
||||
this.responseController.status(res, httpStatusCode);
|
||||
|
||||
const responseHeaders = this.reflectResponseHeaders(callback);
|
||||
const hasCustomHeaders = !isEmpty(responseHeaders);
|
||||
|
||||
this.responseController.setStatus(res, httpStatusCode);
|
||||
hasCustomHeaders &&
|
||||
this.responseController.setHeaders(res, responseHeaders);
|
||||
|
||||
@@ -160,7 +154,8 @@ export class RouterExecutionContext {
|
||||
instance: Controller,
|
||||
callback: (...args: any[]) => any,
|
||||
methodName: string,
|
||||
module: string
|
||||
module: string,
|
||||
requestMethod: RequestMethod,
|
||||
): HandlerMetadata {
|
||||
const cacheMetadata = this.handlerMetadataStorage.get(instance, methodName);
|
||||
if (cacheMetadata) {
|
||||
@@ -199,13 +194,25 @@ export class RouterExecutionContext {
|
||||
|
||||
const fnHandleResponse = this.createHandleResponseFn(
|
||||
callback,
|
||||
isResponseHandled
|
||||
isResponseHandled,
|
||||
);
|
||||
|
||||
const httpCode = this.reflectHttpStatusCode(callback);
|
||||
const httpStatusCode = httpCode
|
||||
? httpCode
|
||||
: this.responseController.getStatusByMethod(requestMethod);
|
||||
|
||||
const responseHeaders = this.reflectResponseHeaders(callback);
|
||||
const hasCustomHeaders = !isEmpty(responseHeaders);
|
||||
|
||||
const handlerMetadata: HandlerMetadata = {
|
||||
argsLength,
|
||||
fnHandleResponse,
|
||||
paramtypes,
|
||||
getParamsMetadata,
|
||||
httpStatusCode,
|
||||
hasCustomHeaders,
|
||||
responseHeaders,
|
||||
};
|
||||
this.handlerMetadataStorage.set(instance, methodName, handlerMetadata);
|
||||
return handlerMetadata;
|
||||
@@ -350,7 +357,7 @@ export class RouterExecutionContext {
|
||||
public createHandleResponseFn(
|
||||
callback: (...args: any[]) => any,
|
||||
isResponseHandled: boolean,
|
||||
httpStatusCode?: number
|
||||
httpStatusCode?: number,
|
||||
) {
|
||||
const renderTemplate = this.reflectRenderTemplate(callback);
|
||||
|
||||
|
||||
@@ -51,10 +51,7 @@ export class RouterResponseController {
|
||||
);
|
||||
}
|
||||
|
||||
public status<TResponse = any>(
|
||||
response: TResponse,
|
||||
statusCode: number
|
||||
) {
|
||||
public setStatus<TResponse = any>(response: TResponse, statusCode: number) {
|
||||
this.applicationRef.status(response, statusCode);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,7 +35,9 @@ describe('RouterResponseController', () => {
|
||||
if (isNil(body)) {
|
||||
return responseRef.send();
|
||||
}
|
||||
return isObject(body) ? responseRef.json(body) : responseRef.send(String(body));
|
||||
return isObject(body)
|
||||
? responseRef.json(body)
|
||||
: responseRef.send(String(body));
|
||||
});
|
||||
});
|
||||
describe('nil', () => {
|
||||
@@ -162,10 +164,8 @@ describe('RouterResponseController', () => {
|
||||
const response = {};
|
||||
const statusCode = 400;
|
||||
|
||||
routerResponseController.status(response, statusCode);
|
||||
expect(
|
||||
statusStub.calledWith(response, statusCode),
|
||||
).to.be.true;
|
||||
routerResponseController.setStatus(response, statusCode);
|
||||
expect(statusStub.calledWith(response, statusCode)).to.be.true;
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user