170 похожих чатов

Короче опять я со своим вопросом по архитектуре. сделал вот

такую штуку, "ручной DI.", в индекс файлах происходит "сборка" модуля и подставление зависимостей. но теперь столкнулся с проблемой например с реализацией authGuard - мидл вары которая будет проверяять авторизован ли юзер или нет. Я ее хочу использовать в роутах, но в то же время эта мидлвара должна импортнуть / как то получить usersRepostiory чтобы после разбора сессии - проверить юзера в базе и добавить его в контекст запроса если он был найден. Для этого он бы должен был импортнуть users/index.js чтобы получить "собраный" модуль но вот незадача - этот индекс же импортит роуты, в которых используется сам этот authGuard. короче circular dependency получается. как быть? что куда вынести? сам authGuard тоже "инжектить" как то? заранее спасибо, сорян за многабукаф.

35 ответов

37 просмотров

при каждом запросе лезть в базу вроде как не круто, хоть и иногда неизбежно, тут посмотри в сторону JWT. а циркуляция зависимостей решается выносом из цепочки в отдельную зависимость "двусторонней части", т.е. в твоём случае мидлвара, роуты и пользователи должны быть отдельные модули. (P.S. соответственно и точка входа в приложение - так же отделена всего ) ...ну и встречный вопрос, реально думаешь сделать лучше чем в nest.js ?

Ну вот да, поддержку предыдущего ответчика Ну а если хочешь, то и нест юзает какой-то плагин для di, забыл как называется

это не реальный проект, я конечно же мог подключить какой то typedi, tsyringe, inversify, или даже сам нест, но я хочу попробовать реализовать это без доп. зависимостей в базу лезть ок, давайте не будем начинать очередной спор про jwt :D

у неста самописный, и там ts, т.е. используется рефлексия и "магия типов"

я замечу что если не использовать DI, а обычные импорты, то такого не возникает, ведь routes/guard - верхний уровень, импортируют нижний services/repository т.е. стрелка только в одно сторону

Кто сказал JWT? 👀

Короче, сейчас в голову пришло создаешь класс с массивом и методом init class DI { private controllers = new Map(); add(controller) { this.controllers.set(controller, new controller()) } get(controller){ return this.controllers.get(controller); } }

А откуда зависимость юзеров от роутов?

можно плиз номер скрина чтобы я понял

роуты юзеров зависят от самого модуля

Я только текст читал.

возможно понимаю, тож эксперементирую, только с ECMA в целом, и думаю можно сделать лучше чем в nest, сегодня только возникла идея попробовать сделать nest.js на ELM, ну или как миниум на babel/ts с всякими фичами вроде import * as controllers from './controllers' т.е. автоиморт из дерикторий и генерация свагера сразу, не описывая тонны декораторв... в общем без декоратора в spring-like подходе ну никак же, не представляю как без них можно сделать удобный AuthGuard. Х.З. как писать на чистом node.js, для меня это тож самое что писать на чистом js для браузера.

посмотрите видос выше, там вполне нормальный апи с бизнес логикой на чистом джс сделан, ну только бабеля немного для импортов

И можно же через ес6 импорт. Вроде проблема цикл зависимостей решается.

Почитай про ес6 модули, там по другому импорты строятся. С телефона в кровати лежу, какие тебе примеры)

посмотрел на репо, чувство прекрасного от реализации требует чего-то попроще, в бизнес-логике много низкоурвневого кода, я считаю в nest.js его так же много, но и тут его в разы больше. Наверное это вкусовщина, однако уже сильно привык к лаконичности описаний.

А зачем req, res, next пробрасываешь в роутах?

проблема двусторонних зависимостей решаются чисто логически выносом глобальной зависимости в третье из двух, так чтоб двое ссылались на третье а третье ни на кого.

это общая рекомендация которая к сожалению не всегда работает

Ты пишешь router.get(req, res, next) = controller.method(req, res, next) А можно просто router.get(controller.method)

нельзя)) там тогда this теряется и получается this.usersRepository is undefined в контроллере

у вас контролер вызывает репозиторий

Если там простой круд без бизнес логики, то, как по мне, городить интеракторы/сервисы смысла нет

если это раз. два он простой сейчас

я пропустил слой сервисов, как верно подметил товарищ выше, но это не суть, потом могу на сервисы заменить

потом может не наступить

не будет времени исправлять

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
вы делали что-то подобное и как? может есть либы готовые? увидел картинку нокода, где всё линиями соединено и стало интересно попробовать то же в ddl на lua сделать. решил с ч...
Victor
8
Подскажите пожалуйста, как в CustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); получить наз...
A Z
7
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
1
Он в одиночку это дело запилил или была какая-то команда?
Aquinary
12
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Всем привет, нужна как никогда, нужна помощь с IO в загрузчике. Пишу в code16 после установки сегментных регистров, пишу вывод символа. Пробовал 2 варианта: # 1 mov $0x0E, %a...
Shadow Akira
14
Карта сайта