Skip to content

Commit 458e2cc

Browse files
refactor(core) improve performance by moving reflection part (redirect)
1 parent a814974 commit 458e2cc

3 files changed

Lines changed: 33 additions & 25 deletions

File tree

packages/core/helpers/handler-metadata-storage.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import { Controller } from '@nestjs/common/interfaces';
22
import * as hash from 'object-hash';
33
import { ContextId } from './../injector/instance-wrapper';
44
import { ParamProperties } from './context-utils';
5-
import { RedirectResponse } from '../router/router-response-controller';
65

76
export const HANDLER_METADATA_SYMBOL = Symbol.for('handler_metadata:cache');
87

@@ -12,7 +11,6 @@ export interface HandlerMetadata {
1211
httpStatusCode: number;
1312
responseHeaders: any[];
1413
hasCustomHeaders: boolean;
15-
httpRedirectResponse: RedirectResponse;
1614
getParamsMetadata: (
1715
moduleKey: string,
1816
contextId?: ContextId,

packages/core/router/router-execution-context.ts

Lines changed: 9 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ import {
99
CUSTOM_ROUTE_AGRS_METADATA,
1010
HEADERS_METADATA,
1111
HTTP_CODE_METADATA,
12+
REDIRECT_METADATA,
1213
RENDER_METADATA,
1314
ROUTE_ARGS_METADATA,
14-
REDIRECT_METADATA,
1515
} from '@nestjs/common/constants';
1616
import { RouteParamsMetadata } from '@nestjs/common/decorators';
1717
import { RouteParamtypes } from '@nestjs/common/enums/route-paramtypes.enum';
@@ -88,7 +88,6 @@ export class RouterExecutionContext {
8888
httpStatusCode,
8989
responseHeaders,
9090
hasCustomHeaders,
91-
httpRedirectResponse,
9291
} = this.getMetadata(instance, callback, methodName, module, requestMethod);
9392

9493
const paramsOptions = this.contextUtils.mergeParamsMetatypes(
@@ -195,9 +194,11 @@ export class RouterExecutionContext {
195194
type === RouteParamtypes.RESPONSE || type === RouteParamtypes.NEXT,
196195
);
197196

197+
const httpRedirectResponse = this.reflectRedirect(callback);
198198
const fnHandleResponse = this.createHandleResponseFn(
199199
callback,
200200
isResponseHandled,
201+
httpRedirectResponse,
201202
);
202203

203204
const httpCode = this.reflectHttpStatusCode(callback);
@@ -207,17 +208,13 @@ export class RouterExecutionContext {
207208

208209
const responseHeaders = this.reflectResponseHeaders(callback);
209210
const hasCustomHeaders = !isEmpty(responseHeaders);
210-
211-
const httpRedirectResponse = this.reflectRedirect(callback);
212-
213211
const handlerMetadata: HandlerMetadata = {
214212
argsLength,
215213
fnHandleResponse,
216214
paramtypes,
217215
getParamsMetadata,
218216
httpStatusCode,
219217
hasCustomHeaders,
220-
httpRedirectResponse,
221218
responseHeaders,
222219
};
223220
this.handlerMetadataStorage.set(instance, methodName, handlerMetadata);
@@ -368,22 +365,20 @@ export class RouterExecutionContext {
368365
public createHandleResponseFn(
369366
callback: (...args: any[]) => any,
370367
isResponseHandled: boolean,
368+
redirectResponse?: RedirectResponse,
371369
httpStatusCode?: number,
372370
) {
373-
const redirectResponse = this.reflectRedirect(callback);
374-
if (redirectResponse && redirectResponse.url) {
375-
return async <TResult, TResponse>(result: TResult, res: TResponse) => {
376-
await this.responseController.redirect(result, res, redirectResponse);
377-
};
378-
}
379-
380371
const renderTemplate = this.reflectRenderTemplate(callback);
381-
382372
if (renderTemplate) {
383373
return async <TResult, TResponse>(result: TResult, res: TResponse) => {
384374
await this.responseController.render(result, res, renderTemplate);
385375
};
386376
}
377+
if (redirectResponse && redirectResponse.url) {
378+
return async <TResult, TResponse>(result: TResult, res: TResponse) => {
379+
await this.responseController.redirect(result, res, redirectResponse);
380+
};
381+
}
387382
return async <TResult, TResponse>(result: TResult, res: TResponse) => {
388383
result = await this.responseController.transformToResult(result);
389384
!isResponseHandled &&

packages/core/test/router/router-execution-context.spec.ts

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -298,11 +298,15 @@ describe('RouterExecutionContext', () => {
298298
const value = 'test';
299299
const response = { render: sinon.spy() };
300300

301-
sinon.stub(contextCreator, 'reflectRedirect').returns(undefined);
302301
sinon.stub(contextCreator, 'reflectResponseHeaders').returns([]);
303302
sinon.stub(contextCreator, 'reflectRenderTemplate').returns(template);
304303

305-
const handler = contextCreator.createHandleResponseFn(null, true, 200);
304+
const handler = contextCreator.createHandleResponseFn(
305+
null,
306+
true,
307+
undefined,
308+
200,
309+
);
306310
await handler(value, response);
307311

308312
expect(response.render.calledWith(template, value)).to.be.true;
@@ -313,11 +317,15 @@ describe('RouterExecutionContext', () => {
313317
const result = Promise.resolve('test');
314318
const response = { render: sinon.spy() };
315319

316-
sinon.stub(contextCreator, 'reflectRedirect').returns(undefined);
317320
sinon.stub(contextCreator, 'reflectResponseHeaders').returns([]);
318321
sinon.stub(contextCreator, 'reflectRenderTemplate').returns(undefined);
319322

320-
const handler = contextCreator.createHandleResponseFn(null, true, 200);
323+
const handler = contextCreator.createHandleResponseFn(
324+
null,
325+
true,
326+
undefined,
327+
200,
328+
);
321329
handler(result, response);
322330

323331
expect(response.render.called).to.be.false;
@@ -338,9 +346,12 @@ describe('RouterExecutionContext', () => {
338346
};
339347
const response = { redirect: sinon.spy() };
340348

341-
sinon.stub(contextCreator, 'reflectRedirect').returns(redirectResponse);
342-
343-
const handler = contextCreator.createHandleResponseFn(null, true, 200);
349+
const handler = contextCreator.createHandleResponseFn(
350+
() => {},
351+
true,
352+
redirectResponse,
353+
200,
354+
);
344355
await handler(redirectResponse, response);
345356

346357
expect(
@@ -357,11 +368,15 @@ describe('RouterExecutionContext', () => {
357368
const result = Promise.resolve('test');
358369
const response = { redirect: sinon.spy() };
359370

360-
sinon.stub(contextCreator, 'reflectRedirect').returns(undefined);
361371
sinon.stub(contextCreator, 'reflectResponseHeaders').returns([]);
362372
sinon.stub(contextCreator, 'reflectRenderTemplate').returns(undefined);
363373

364-
const handler = contextCreator.createHandleResponseFn(null, true, 200);
374+
const handler = contextCreator.createHandleResponseFn(
375+
null,
376+
true,
377+
undefined,
378+
200,
379+
);
365380
handler(result, response);
366381

367382
expect(response.redirect.called).to.be.false;

0 commit comments

Comments
 (0)