Минимизация публикации данных и помощь в повышении безопасности

Мое путешествие

Я люблю JS, Node и Meteor, но с тех пор, как я ушел с предыдущей работы через 10 лет, столкнулся с рядом проблем. Эта софтверная компания делала все свои разработки на JAVA и действительно работала в негибкой манере старой школы. Чтобы совершить переход, мне действительно пришлось начать переучивать свой мозг.

По большей части мне действительно нравятся все новые принципы и способы ведения дел, но есть пара моментов, которые я действительно не освещаю, например:

  • Чрезмерная зависимость от неблокирующих асинхронных вызовов (иногда последовательность действительно важна и не может быть исключена из архитектуры)
  • Много данных хранится и доступно на стороне клиента (например, pub/sub, и я знаю, что вы можете ограничить поля и т. д., но все же)
  • Весь ваш javascript находится в свободном доступе для просмотра всеми клиентами (т. е. иногда вам нужно выполнять «совершенно секретные» действия)

Мое решение

Цели:

  1. Простой вызов методов сервера из клиента с использованием простых шаблонов кодирования
  2. Хранить минимум данных на клиенте
  3. Иметь рендеринг на стороне клиента (поэтому вам не нужны тонны серверной мощности), но в то же время выполнять часть тяжелой работы на сервере, чтобы ускорить время загрузки (гибридный подход к рендерингу).
  4. Возможность скрыть конфиденциальный код от клиента, оставив его на сервере

Принимая во внимание вышеизложенные задачи и цели, я предлагаю следующее.

Использование промисов на клиенте в Meteor

Вы должны проверить пост Роба о том, как вызывать методы сервера напрямую из клиента, используя обещания и async/await. Это действительно элегантное решение.

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

Добавление реактивности

Проблема, с которой я тогда столкнулась, заключалась в реактивности. Очень не хотелось терять преимущества текущего подхода pub/sub. Поэтому я взял пакет Meteor, включенный в пост Робса, и расширил его.

Для получения дополнительной информации о моем новом расширенном пакете ознакомьтесь со следующим Git:



Пакет можно установить, введя в папку проекта Meteor следующее:

meteor add goldenpassport:reactive-promise-call

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

Результаты

Страницы наших шаблонов html и js теперь компактны и скудны, а на клиенте существуют только основные функции, связанные с пользовательским интерфейсом. Вся обработка данных, манипуляции и сложные вычисления теперь могут выполняться на сервере.

Возможности для совершенствования

Конечно, всегда! Ключевым моментом на данный момент является то, что пакет использует Meteor.setTimeout для опроса метода сервера. Он работает хорошо, но его можно расширить, включив в него такие вещи, как «Observables».

Обновление: 10 марта 2017 г. Производительность, которую я получаю от использования Observables, далеко не так хороша, как при использовании обещаний. Начинаю любить обещания!

Спасибо за чтение!!!