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

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

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

35 ответов

41 просмотр

при каждом запросе лезть в базу вроде как не круто, хоть и иногда неизбежно, тут посмотри в сторону 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 в контроллере

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

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

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

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

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

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

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

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

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
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
Карта сайта