From c303849d4dfbc692436d1f28265b1ad37ccb98a2 Mon Sep 17 00:00:00 2001 From: undefined Date: Thu, 29 Aug 2024 18:49:49 +0800 Subject: [PATCH] framework: better middleware stack --- framework/framework/server.ts | 16 ++++++++++++---- packages/hydrooj/src/service/server.ts | 1 - 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/framework/framework/server.ts b/framework/framework/server.ts index 2620173b7..62e64a37c 100644 --- a/framework/framework/server.ts +++ b/framework/framework/server.ts @@ -290,14 +290,19 @@ class NotFoundHandler extends Handler { function executeMiddlewareStack(context: any, middlewares: { name: string, func: Function }[]) { let index = -1; context.__timers ||= {}; - async function dispatch(i) { - if (i <= index) throw new Error('next() called multiple times'); + function dispatch(i) { + if (i <= index) return Promise.reject(new Error('next() called multiple times')); index = i; - if (!middlewares[i]) return null; + if (!middlewares[i]) return Promise.resolve(); const name = middlewares[i].name; + const fn = middlewares[i].func; context.__timers[`${name}.start`] = Date.now(); try { - return await middlewares[i].func(context, dispatch.bind(null, i + 1)); + return Promise.resolve(fn(context, dispatch.bind(null, i + 1))).finally(() => { + context.__timers[`${name}.end`] = Date.now(); + }); + } catch (e) { + return Promise.reject(e); } finally { context.__timers[`${name}.end`] = Date.now(); } @@ -510,8 +515,11 @@ ${c.response.status} ${endTime - startTime}ms ${c.response.length}`); } } catch (e) { try { + console.log(1, e); await this.ctx.serial(`handler/error/${HandlerClass.name.replace(/Handler$/, '')}`, h, e); + console.log(2, e); await this.ctx.serial('handler/error', h, e); + console.log(3, e); await h.onerror(e); } catch (err) { logger.error(err); diff --git a/packages/hydrooj/src/service/server.ts b/packages/hydrooj/src/service/server.ts index 54fb52490..13c7d7397 100644 --- a/packages/hydrooj/src/service/server.ts +++ b/packages/hydrooj/src/service/server.ts @@ -102,7 +102,6 @@ export class Handler extends HandlerOriginal { }); } else { this.response.status = error instanceof UserFacingError ? error.code : 500; - logger.error(error); this.response.template = error instanceof UserFacingError ? 'error.html' : 'bsod.html'; this.response.body = { UserFacingError,