From dafde87ad2bd17b2c4c48b7433ffa9e3471ffcc7 Mon Sep 17 00:00:00 2001 From: "buli.zk" Date: Wed, 24 Jan 2024 14:49:26 +0800 Subject: [PATCH 1/5] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8Daop=E4=B8=A2?= =?UTF-8?q?=E5=A4=B1=E5=8E=9F=E5=BC=95=E7=94=A8=EF=BC=8C=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E4=BF=AE=E6=94=B9ctx=E7=9A=84=E9=80=BB=E8=BE=91=E5=A4=B1?= =?UTF-8?q?=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/aop-runtime/src/AspectExecutor.ts | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/core/aop-runtime/src/AspectExecutor.ts b/core/aop-runtime/src/AspectExecutor.ts index e2f81efc..4a1d19ef 100644 --- a/core/aop-runtime/src/AspectExecutor.ts +++ b/core/aop-runtime/src/AspectExecutor.ts @@ -42,7 +42,14 @@ export class AspectExecutor { for (const aspectAdvice of this.aspectAdviceList) { const advice: IAdvice = ctx.that[aspectAdvice.name]; if (advice.beforeCall) { - await advice.beforeCall({ ...ctx, adviceParams: aspectAdvice.adviceParams }); + /** + * 这里...写法使传入的参数变成了一个新的对象 + * 因此beforeCall里面如果修改了ctx.args + * 最新的args是不会在方法里生效的 + * 需要保持为原ctx同一个引用 + * 其余地方类似问题 + */ + await advice.beforeCall(Object.assign(ctx, { adviceParams: aspectAdvice.adviceParams })); } } } @@ -51,7 +58,7 @@ export class AspectExecutor { for (const aspectAdvice of this.aspectAdviceList) { const advice: IAdvice = ctx.that[aspectAdvice.name]; if (advice.afterReturn) { - await advice.afterReturn({ ...ctx, adviceParams: aspectAdvice.adviceParams }, result); + await advice.afterReturn(Object.assign(ctx, { adviceParams: aspectAdvice.adviceParams }), result); } } } @@ -60,7 +67,7 @@ export class AspectExecutor { for (const aspectAdvice of this.aspectAdviceList) { const advice: IAdvice = ctx.that[aspectAdvice.name]; if (advice.afterThrow) { - await advice.afterThrow({ ...ctx, adviceParams: aspectAdvice.adviceParams }, error); + await advice.afterThrow(Object.assign(ctx, { adviceParams: aspectAdvice.adviceParams }), error); } } } @@ -69,7 +76,7 @@ export class AspectExecutor { for (const aspectAdvice of this.aspectAdviceList) { const advice: IAdvice = ctx.that[aspectAdvice.name]; if (advice.afterFinally) { - await advice.afterFinally({ ...ctx, adviceParams: aspectAdvice.adviceParams }); + await advice.afterFinally(Object.assign(ctx, { adviceParams: aspectAdvice.adviceParams })); } } } @@ -85,10 +92,9 @@ export class AspectExecutor { const fn = advice.around; if (fn) { functions.push(async (ctx: InternalAdviceContext, next: () => Promise) => { - const fnCtx: AdviceContext = { - ...ctx, - adviceParams: aspectAdvice.adviceParams, - }; + const fnCtx: AdviceContext = Object.assign(ctx, { + adviceParams: aspectAdvice.adviceParams + }); return await fn.call(advice, fnCtx, next); }); } From 079ae598fbcb2117285c15ef2084cbf820c4d6a1 Mon Sep 17 00:00:00 2001 From: "buli.zk" Date: Wed, 24 Jan 2024 15:25:19 +0800 Subject: [PATCH 2/5] =?UTF-8?q?test:=20=E6=B7=BB=E5=8A=A0beforeCall?= =?UTF-8?q?=E4=BF=AE=E6=94=B9ctx.args=E7=9A=84=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/fixtures/modules/hello_succeed/Hello.ts | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/core/aop-runtime/test/fixtures/modules/hello_succeed/Hello.ts b/core/aop-runtime/test/fixtures/modules/hello_succeed/Hello.ts index 4de99037..940c4985 100644 --- a/core/aop-runtime/test/fixtures/modules/hello_succeed/Hello.ts +++ b/core/aop-runtime/test/fixtures/modules/hello_succeed/Hello.ts @@ -21,10 +21,12 @@ export class CallTrace { } export const pointcutAdviceParams = { - point: Math.random().toString(), - cut: Math.random().toString(), + foo: 'bar', }; +// 测试aop修改ctx的args的值 +const TEST_CTX_ARGS_VALUE = 123; + @Advice() export class PointcutAdvice implements IAdvice { @Inject() @@ -40,11 +42,13 @@ export class PointcutAdvice implements IAdvice { name: ctx.args[0], adviceParams: ctx.adviceParams, }); + ctx.args = [...ctx.args, TEST_CTX_ARGS_VALUE]; } async afterReturn(ctx: AdviceContext, result: any): Promise { assert.ok(ctx.adviceParams); assert.deepStrictEqual(ctx.adviceParams, pointcutAdviceParams); + assert.deepStrictEqual(ctx.args[ctx.args.length - 1], TEST_CTX_ARGS_VALUE); this.callTrace.addMsg({ className: PointcutAdvice.name, methodName: 'afterReturn', @@ -106,8 +110,7 @@ export class Hello { } export const crosscutAdviceParams = { - cross: Math.random().toString(), - cut: Math.random().toString(), + foo: 'bar', }; @Crosscut({ From add78ac70de661906d21eb82950637b678cba0d7 Mon Sep 17 00:00:00 2001 From: "buli.zk" Date: Wed, 24 Jan 2024 15:47:23 +0800 Subject: [PATCH 3/5] =?UTF-8?q?chore:=20=E5=8A=A0=E9=80=97=E5=8F=B7?= =?UTF-8?q?=EF=BC=8C=E8=A7=A3=E5=86=B3lint=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/aop-runtime/src/AspectExecutor.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/aop-runtime/src/AspectExecutor.ts b/core/aop-runtime/src/AspectExecutor.ts index 4a1d19ef..7a5be46c 100644 --- a/core/aop-runtime/src/AspectExecutor.ts +++ b/core/aop-runtime/src/AspectExecutor.ts @@ -93,7 +93,7 @@ export class AspectExecutor { if (fn) { functions.push(async (ctx: InternalAdviceContext, next: () => Promise) => { const fnCtx: AdviceContext = Object.assign(ctx, { - adviceParams: aspectAdvice.adviceParams + adviceParams: aspectAdvice.adviceParams, }); return await fn.call(advice, fnCtx, next); }); From 45cddfccd009d707b8d164f84db2be64800a2606 Mon Sep 17 00:00:00 2001 From: "buli.zk" Date: Wed, 24 Jan 2024 21:30:33 +0800 Subject: [PATCH 4/5] =?UTF-8?q?feat:=20=E8=BF=98=E5=8E=9Fctx=E7=9A=84Objec?= =?UTF-8?q?t.assign=E6=94=B9=E5=8A=A8=EF=BC=8C=E4=BB=85=E6=94=B9=E5=8A=A8b?= =?UTF-8?q?eforeCall?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/aop-runtime/src/AspectExecutor.ts | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/core/aop-runtime/src/AspectExecutor.ts b/core/aop-runtime/src/AspectExecutor.ts index 7a5be46c..a6a2c39b 100644 --- a/core/aop-runtime/src/AspectExecutor.ts +++ b/core/aop-runtime/src/AspectExecutor.ts @@ -46,10 +46,12 @@ export class AspectExecutor { * 这里...写法使传入的参数变成了一个新的对象 * 因此beforeCall里面如果修改了ctx.args * 最新的args是不会在方法里生效的 - * 需要保持为原ctx同一个引用 - * 其余地方类似问题 + * 先保证args可以生效 + * 不改动其余地方 */ - await advice.beforeCall(Object.assign(ctx, { adviceParams: aspectAdvice.adviceParams })); + const params = { ...ctx, adviceParams: aspectAdvice.adviceParams }; + await advice.beforeCall(params); + ctx.args = params.args; } } } @@ -58,7 +60,7 @@ export class AspectExecutor { for (const aspectAdvice of this.aspectAdviceList) { const advice: IAdvice = ctx.that[aspectAdvice.name]; if (advice.afterReturn) { - await advice.afterReturn(Object.assign(ctx, { adviceParams: aspectAdvice.adviceParams }), result); + await advice.afterReturn({ ...ctx, adviceParams: aspectAdvice.adviceParams }, result); } } } @@ -67,7 +69,7 @@ export class AspectExecutor { for (const aspectAdvice of this.aspectAdviceList) { const advice: IAdvice = ctx.that[aspectAdvice.name]; if (advice.afterThrow) { - await advice.afterThrow(Object.assign(ctx, { adviceParams: aspectAdvice.adviceParams }), error); + await advice.afterThrow({ ...ctx, adviceParams: aspectAdvice.adviceParams }, error); } } } @@ -76,7 +78,7 @@ export class AspectExecutor { for (const aspectAdvice of this.aspectAdviceList) { const advice: IAdvice = ctx.that[aspectAdvice.name]; if (advice.afterFinally) { - await advice.afterFinally(Object.assign(ctx, { adviceParams: aspectAdvice.adviceParams })); + await advice.afterFinally({ ...ctx, adviceParams: aspectAdvice.adviceParams }); } } } @@ -92,9 +94,10 @@ export class AspectExecutor { const fn = advice.around; if (fn) { functions.push(async (ctx: InternalAdviceContext, next: () => Promise) => { - const fnCtx: AdviceContext = Object.assign(ctx, { + const fnCtx: AdviceContext = { + ...ctx, adviceParams: aspectAdvice.adviceParams, - }); + }; return await fn.call(advice, fnCtx, next); }); } From 6386dc73e744146fcef9f05bff27336d60ffd284 Mon Sep 17 00:00:00 2001 From: "buli.zk" Date: Thu, 25 Jan 2024 09:57:12 +0800 Subject: [PATCH 5/5] =?UTF-8?q?test:=20=E8=BF=98=E5=8E=9F=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E4=B8=BA=E9=9A=8F=E6=9C=BA=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/fixtures/modules/hello_succeed/Hello.ts | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/core/aop-runtime/test/fixtures/modules/hello_succeed/Hello.ts b/core/aop-runtime/test/fixtures/modules/hello_succeed/Hello.ts index 940c4985..1cf92c11 100644 --- a/core/aop-runtime/test/fixtures/modules/hello_succeed/Hello.ts +++ b/core/aop-runtime/test/fixtures/modules/hello_succeed/Hello.ts @@ -21,7 +21,8 @@ export class CallTrace { } export const pointcutAdviceParams = { - foo: 'bar', + point: Math.random().toString(), + cut: Math.random().toString(), }; // 测试aop修改ctx的args的值 @@ -110,7 +111,8 @@ export class Hello { } export const crosscutAdviceParams = { - foo: 'bar', + cross: Math.random().toString(), + cut: Math.random().toString(), }; @Crosscut({