ОБНОВЛЕНИЕ 1. Я сделал большой прогресс в этом вопросе. Я в значительной степени отказался (по крайней мере, на данный момент, но, возможно, в долгосрочной перспективе) от идеи предоставления загруженных пользователем модулей. Тем не менее, я разрабатываю структуру, чтобы можно было определить и загрузить несколько модулей. Модуль будет инициализирован, настроен на собственные маршруты и будет иметь "общедоступный" каталог для обслуживания Javascript. Чем больше я его вижу, тем больше я понимаю, что могу (должен) также перемещать вызовы, которые теперь являются общесистемными в модуле под названием "система".
ОБНОВЛЕНИЕ 2. Я сделал ОГРОМНЫЙ прогресс в этом. Я собираюсь совершить кучу кода на GitHub, который позволит людям действительно делать действительно хорошее модульное программирование (с модулями, отображающими как клиентский, так и серверный код) с помощью Node и Express. Пожалуйста, следите за обновлениями.
ОБНОВЛЕНИЕ 3. Я переписал эту вещь как систему для регистрации модулей и позволяет им общаться через систему событий/крючков. Это происходит очень красиво. У меня есть тонны кода, которые уже хорошо подходят - я просто переношу его в новую систему. Не стесняйтесь взглянуть на проект на GitHub: https://github.com/mercmobily/hotplate)
ОБНОВЛЕНИЕ 4. Это хорошо. Оказывается, моя идея о том, что модуль является клиентом И сервером, действительно работает.
ОБНОВЛЕНИЕ 5. Модуль приближается к чему-то полезному. Я применил новый загрузчик, который будет учитывать, что функция init() будет invokeAll(), и будет убедиться, что сначала будут загружены модули, обеспечивающие этот крючок. Это открывает плиту на совершенно новый уровень.
ОБНОВЛЕНИЕ 6: плита теперь близка к 12000 строкам кода. К моменту его завершения, когда-то в феврале, я предполагаю, что это будет около 20000 строк кода. Он делает много вещей, и все это началось здесь, на StackOverflow! Мне нужно, чтобы он разработал мой собственный SaaS, поэтому мне действительно нужно закончить его к февралю (чтобы я мог спринте до июля и закончить первую версию BookingDojo). Спасибо всем!
Я пишу что-то, что, вероятно, превратится в довольно большое программное обеспечение. Короче говоря, это nodejs + Express + Mongodb/Mongoose + Dojo (клиентская сторона).
ПРИМЕЧАНИЕ. Вопросы в этом тексте отмечены как [Q1], [Q2] и т.д.
Исходя из фона Drupal (и зная, как coooomplex он развился, чего-то, чего я хотел бы избежать), я немного мошенник модуля. На данный момент я выполнил шаблон приложения (hotplate: https://github.com/mercmobily/hotplate). Он делает все скучные вещи (пользователи, рабочие пространства, напоминание пароля и т.д.), И ему не хватает нескольких частей.
Я хотел бы придумать дизайн, который позволит модулям аналогично Drupal (но, возможно, лучше). То есть:
- Модули могут определять новые маршруты и обрабатывать их
- Модули устанавливаются в системном масштабе, и тогда каждая рабочая область может включить набор из них.
Первоначальная архитектура может быть чем-то вроде этих строк:
- Каталог "modules", где есть один каталог для каждого модуля
- В каждом модуле есть каталог для "общедоступных" файлов для стороны JavaScript.
- Каждый модуль имеет public/startup.js, который будет включен в приложение javascript
- Каждый модуль будет иметь сервер / node.js, который будет включен "на лету" сервером, если/при необходимости
- Определен один маршрут, например, /app/:workspaceid/modules/MODULE_NAME/.* с промежуточным программным обеспечением, которое проверяет, включено ли в это рабочее пространство MODULE_NAME, и если это так, вызывает функцию модуля с переданным параметром
[Q1]: Это немного смутно?
Вопросы:
-
Я хочу сделать эту динамику. Я хотел бы, чтобы модули были необходимы, когда это необходимо на месте. Это должно быть достаточно легко сделать, требуя вещей "на лету".
-
server/node.js будет иметь функцию, но эта функция чувствует/выглядит ужасно много, как сам роутер
[Q2] Есть ли у вас какие-то конкретные подсказки об этом?
Они не кажутся слишком серьезными. Однако реальный вопрос возникает, когда вы говорите о безопасности.
- Защита
. Это неприятно. В настоящий момент все вызовы сделают правильные запросы для фильтрации mongoDb с помощью workspaceId. Я хотел бы каким-то образом применить такой механизм, чтобы модули не обладали явным доступом к базе данных, поэтому каждый модуль не имеет доступа к данным, принадлежащим другим рабочим пространствам.
-
Пользовательские модули. Я хотел бы дать пользователям возможность загружать свои собственные модули (и, возможно, сделать их доступными для других пользователей). Но это эффективно означает, что пользователи могут загружать код, который будет выполняться самим Node! Как бы вы это сделали?
[Q3] Как вы относитесь к этим проблемам конфиденциальности/безопасности? Есть ли способ, например, запустить загруженный пользователем код в виде песочницы Node? Как насчет доступа к файловой системе и т.д.?
Спасибо!