И немного изоморфной проверки

Не знаю, как я впервые обнаружил ArangoDB, но это определенно интересно. Возможно, это был логотип Avocado, и я проголодался (изначально ArangoDB назывался AvocadoDB; название было опущено, но логотип остался).

Первое, с чем вы можете столкнуться с Arango, это то, что это своего рода мастер на все руки. Это хранилище документов NoSQL с похожим на SQL языком запросов, но оно не имеет схемы и может выполнять графические операции изначально. Это также в основном основная память. И, о да, это интерпретатор на основе Javascript V8, который может размещать HTTP-серверы. Сюрприз! Этот Javascript является синхронным и использует пул потоков . Итак, с ArangoDB он бросает вызов определениям и переворачивает предположения с ног на голову.

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

Чтобы погрузиться в дело, я начал читать документы. Учитывая широкую сферу применения ArangoDB, документация немного страдает от попытки охватить все и рассказать вам, что именно и почему. Также полезно загрузить Community Edition и установить его на свой компьютер разработчика. Мне еще предстоит найти облачного провайдера, который запустил бы недорогой экземпляр для игры, поэтому вам нужно будет установить его. Я бы посоветовал запускать и останавливать его вручную, поскольку экземпляр сервера неплохо использует память, но и не крошечный.

Приятной особенностью ArangoDB является то, что он поставляется со встроенной консолью веб-управления под названием Ardvark. Ардварк не идеален (несколько сбоев / икоты, когда я делал несколько резких движений), но он помогает в самом начале исследования системы.

На Javascript

Хотя ArangoDB написан в основном на C ++, он очень тесно интегрируется с Javascript. Любые текстовые манипуляции с базой данных будут выполняться с синтаксисом Javascript. Фреймворк Foxx, встроенный в ArangoDB, позволяет создавать микросервисы в среде, которая кажется похожей и в некоторой степени совместимой с Node.js. Это убедительно для меня: мне действительно никогда не нужно оставлять Javascript для создания веб-приложения.

Это подводит меня к тому, что, по-видимому, действительно предназначено для Аранго: создание CRUD (C reate, R ead, U pdate и D elete) приложения. Может показаться, что 95% веб-приложений в мире на каком-то уровне являются просто приложениями CRUD. Меня шокирует то, что не существует интегрированного решения, позволяющего сократить путь создания приложений этого класса. Я вижу, что компании, с которыми я работаю, часто используют совершенно неподходящие инструменты при создании приложений на основе CRUD.

Rant. Одним из таких неподходящих инструментов является Wordpress. Вы были бы удивлены количеством проектов, основанных на Wordpress, которые на самом деле представляют собой своего рода злоупотребление платформой для ведения блогов в приложении CRUD с частным C / U / D. Иногда разработчики создают частную систему на основе входа в систему, основанную на жевательной резинке, проводе и административной панели Wordpress. Очень часто это заканчивается слезами или, по крайней мере, очень медленным, сложным в обслуживании и небезопасным веб-сайтом, который никого не радует. Однако создание этого типа сайта Wordpress недорогое в создании и дешевом размещении, я думаю, поэтому его трудно игнорировать.

Я действительно вижу, что ArangoDB преуспевает в создании этих базовых типов сайтов, поскольку довольно просто построить операции CRUD в несколько строк. Фреймворк Foxx поддерживает JWT и сеансы, так что вы уже довольно далеко продвинулись, чтобы иметь систему входа в систему.

Маршрутизация очень Экспресс. Он поддерживает тот же базовый формат пути, промежуточное программное обеспечение и те же сигнатуры функций req, res, next обработчика / промежуточного программного обеспечения. Кроме того, он может использовать дочерние маршрутизаторы так же, как Express имеет монтируемые маршрутизаторы.

Проблема, с которой люди сталкиваются при создании сайтов CRUD, заключается в том, что проверка может быть настолько сложной, что разработчики оставляют ее на свой страх и риск. Foxx использует модуль joi для проверки ввода, вывода и параметров. Он очень интегрирован, и меня это устраивает. У joi очень простой и понятный синтаксис. Скорее всего, проведя немного времени с дзёи, вы сможете просто правильно угадать синтаксис, а не запоминать его.

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

Поскольку теперь у вас есть Javascript на каждом уровне нашего стека, это заставило меня задуматься. Не могли бы вы объединить валидацию переднего плана с валидацией бэкенда? Возможно! Это изоморфная проверка!

Вот план игры:

  • Инкапсулируйте валидацию joi внутри функции с передачей joi в качестве аргумента:
var myThing = function(joi) {
   return joi
     .object()
     .keys({
        exists : joi.boolean().required()
     })
};

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

  • В микросервисе Foxx настройте тело вашего маршрута с помощью этой проверки:
router
   .post('/my-thing',function(req,res) {
     ...
   })
   .body(myThing(joi))

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

  • Теперь это интересно. Foxx позволяет создавать маршруты, совершенно не связанные с ArangoDB. Давайте настроим маршрут проверки, а затем отправим обратно источник функции, которую мы создали на первом шаге.
router
   .get('/validator/:varName',function(req,res) {
      res.send(`var ${req.pathParams.varName} = ${myThing.toString()};`);
  });

Это может показаться немного забавным - я использую обратные кавычки, потому что это строка шаблона, и фигурные скобки для интерполяции varName и принуждения функции myThing к функции. Если вы перейдете к нему ([префикс службы] / валидатор / [все, что можно использовать как переменную]), Foxx ответит функцией. Так, например, переход к [префикс службы] / validator / myValidator дает следующее:

var myValidator = function(joi) {
   return joi
     .object()
     .keys({
        exists : joi.boolean().required()
     })
};
  • Сейчас Joi обычно представляет собой библиотеку проверки на стороне сервера, однако, используя что-то вроде webpack (или browserify) и joi-browser, вы можете вызывать Joi из своего клиентского кода. Затем вы включаете маршрут из предыдущего шага как обычный тег скрипта. Наконец, вы запускаете свой JS как обычно (после предварительной обработки):
import joi from 'joi-browser';
console.log(
   joi.validate({ exists : true }, myValidator(joi))
);

Этот метод позволяет избежать дублирования усилий по проверке и сосредоточиться на создании приложения. Следите за обновлениями, я работаю над еще несколькими советами и приемами Foxx и ArangoDB по мере развития моего проекта.