Browse Source

feat: register RequestContext in request-scope container

e22m4u 2 months ago
parent
commit
adbe56cdc2
3 changed files with 24 additions and 1 deletions
  1. 1 0
      dist/cjs/index.cjs
  2. 3 0
      src/trie-router.js
  3. 20 1
      src/trie-router.spec.js

+ 1 - 0
dist/cjs/index.cjs

@@ -1605,6 +1605,7 @@ var _TrieRouter = class _TrieRouter extends DebuggableService {
       const { route, params } = resolved;
       const container = new import_js_service6.ServiceContainer(this.container);
       const context = new RequestContext(container, req, res);
+      container.set(RequestContext, context);
       context.params = params;
       const reqDataOrPromise = this.getService(RequestParser).parse(req);
       if (isPromise(reqDataOrPromise)) {

+ 3 - 0
src/trie-router.js

@@ -88,6 +88,9 @@ export class TrieRouter extends DebuggableService {
       // нельзя было модифицировать
       const container = new ServiceContainer(this.container);
       const context = new RequestContext(container, req, res);
+      // регистрация контекста запроса в сервис-контейнере
+      // для удобного доступа через container.getRegistered(RequestContext)
+      container.set(RequestContext, context);
       // запись параметров пути в контекст запроса,
       // так как они были определены в момент
       // поиска подходящего роута

+ 20 - 1
src/trie-router.spec.js

@@ -25,7 +25,7 @@ describe('TrieRouter', function () {
   });
 
   describe('requestListener', function () {
-    it('to be a function', function () {
+    it('should be a function', function () {
       const router = new TrieRouter();
       expect(typeof router.requestListener).to.be.eq('function');
     });
@@ -455,6 +455,25 @@ describe('TrieRouter', function () {
     });
   });
 
+  describe('_handleRequest', function () {
+    it('should register the RequestContext in the request-scope ServiceContainer', function (done) {
+      const router = new TrieRouter();
+      router.defineRoute({
+        method: HttpMethod.GET,
+        path: '/',
+        handler(ctx) {
+          const res = ctx.container.getRegistered(RequestContext);
+          expect(res).to.be.eq(ctx);
+          expect(res).to.be.not.eq(router.container);
+          done();
+        },
+      });
+      const req = createRequestMock();
+      const res = createResponseMock();
+      router.requestListener(req, res);
+    });
+  });
+
   describe('addHook', function () {
     it('adds the given hook to the HookRegistry and returns itself', function () {
       const router = new TrieRouter();