Статьи

Безсерверная логика с функциями области

Конечный продукт
Что вы будете создавать

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

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

Решение для безсерверных вычислений Realm сродни Amazon AWS Lambda или Microsoft Azure Functions . Как и они, он позволяет вам запускать код без предоставления собственных серверов. Ваши функции будут работать на Realm Object Server. Функции Realm дают возможность писать функции на основе JavaScript, которые реагируют на живые объекты Realm и управляют ими через интерфейс панели мониторинга Realm.

Если вам нужно реагировать на живые объекты и отправлять push-уведомления пользователям или запускать вызов API для другого SDK стороннего производителя, такого как Twilio , реагирующие события через функции позволяют вам реагировать и реагировать на стороне сервера. В этом уроке вы узнаете, как работать с функциями области.

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

В этом уроке мы рассмотрим следующее:

  • обработка событий и функции
  • причины использовать функции
  • создание функций из панели инструментов
  • интеграция функций в ваш Realm Object Server.

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

Если вы хотите узнать о Realm, ознакомьтесь с предыдущими статьями этой серии.

  • iOS SDK
    Realm Мобильная база данных для iOS
  • стриж
    Начало работы с мобильной платформой Realm для iOS

В предыдущих руководствах вы использовали Realm для создания постоянства на устройстве, а также для синхронизации пользовательских данных с облаком, но одно заметное отсутствие было в умной работе с данными на стороне сервера. Иногда нам нужна логика на стороне сервера, которая может реагировать на изменения в данных, так же как триггеры работают в традиционных базах данных.

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

Realm Functions — это наш «серверный» логический уровень приложения, на котором вы можете легко создавать серверные функции с помощью простого JavaScript, не требуя бэкэнд-команды. Когда синхронизируются изменения данных, ваша пользовательская логика выполняется, что позволяет мобильным разработчикам быстро создавать и поставлять сложные серверно-зависимые функции. Realm.io

Функции обрабатывают события через Realm Object Server с помощью функций Node.js, которые впоследствии вызываются глобальным API-интерфейсом прослушивания Realm Object Server, который передает changeEvent() запускаемые через логику функции. Это выполняется с помощью экземпляра Node.js на стороне сервера, который подключается к глобальному API прослушивателя событий, позволяя разработчикам наблюдать за изменениями в разных сферах и выполнять фильтрацию для конкретных областей, соответствующих определенному шаблону Regex.

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

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

Создание функции обработки событий Realm включает в себя создание небольшого приложения Node.js с package.json для определения приложения и его зависимостей. Для получения дополнительной информации о создании обработчиков событий в Realm Object Server обратитесь к Руководству Realm по обработке событий .

Далее мы начнем настраивать нашу первую функцию Realm.

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

Сначала перейдите на панель инструментов Realm Object Server и выберите вкладку « Функции ». На этой странице Realm уже предоставляет вам пример функции, которую вы можете быстро включить и запустить, сначала назвав функцию, выбрав, к какой области ее применить (наше рабочее приложение в данном случае RealmDoApp), а затем запустив событие функции. слушатель, нажав кнопку Старт .

Запуск слушателя события функции

Сделайте это, запустив приложение для iOS в Xcode Simulator, и создайте новую задачу напоминания. Вы заметите, что журнал ниже заполняется сообщениями журнала для различных состояний вашего приложения.

регистрировать сообщения, показывающие различные состояния вашего приложения

Давайте посмотрим на пример кода более подробно:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
console.log(«Starting function»);
// add your initialization code here
 
module.exports = function(changeEvent) {
    // event handler code goes here
 
    console.log(«Changes in realm at:», changeEvent.path);
 
    var realm = changeEvent.realm;
     
    for (var className in changeEvent.changes) {
        var changes = changeEvent.changes[className];
        var objects = realm.objects(className);
         
        console.log(«Changes in Model:», className);
        for (let pos of changes.insertions) {
            console.log(«- object inserted at position «, pos, » : «, objects[pos]);
        }
        for (let pos of changes.modifications) {
            console.log(«- object modified at position «, pos, » : «, objects[pos]);
        }
        for (let pos of changes.deletions) {
            console.log(«- object deleted at position «, pos);
        }
    }
    console.log(«»);
};

Функция начинается с предоставления метода обработки события через экспорт. Функции обработки событий принимают в качестве параметра changeEvent . Эта простая функция просто выводит changeEvent.path на консоль, показывая, что именно меняется.

Затем мы получаем ссылку на измененную область через объект changeEvent , а затем получаем список объектов и изменений. Мы выводим запись всех вставок, модификаций и удалений в консоль.

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

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

Прежде чем вводить код, приведенный ниже, установите стороннюю библиотеку, введя следующее в Realm Object Server:

npm install google-libphonenumber --save

Нажмите Stop на консоли, чтобы остановить выполнение функции, а затем измените функцию с помощью следующего кода:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
var PNF = require(‘google-libphonenumber’).PhoneNumberFormat;
var phoneUtil = require(‘google-libphonenumber’).PhoneNumberUtil.getInstance();
 
console.log(«Starting function»);
// add your initialization code here
 
module.exports = function (change_event) {
    var realm = change_event.realm;
    var changes = change_event.changes.Reminder;
    var taskIndexes = changes.modifications;
    console.log(«Change detected: » + changes + » for taskindexes «, taskIndexes);
    // Get the task objects to processes
    var reminders = realm.objects(«Reminder»);
    var reminder = reminders[reminders.length — 1];
    // Retrieve the task object from the Realm with index
    console.log(«New task received: » + change_event.path);
    console.log(«Task Reminder «, reminder);
    // get date from wit.ai
    // probably use this https://wit.ai/docs/http/20160526#get—message-link
    // node-wit: https://github.com/wit-ai/node-wit
    var phoneNumber = phoneUtil.parse(reminder.name, ‘US’);
    if (!phoneNumber) {
        console.log(«Not a phone number»);
        return;
    }
    console.log(«Phone converted to «, phoneUtil.format(phoneNumber, PNF.INTERNATIONAL));
 
    realm.write(function () {
        reminder.name = phoneUtil.format(phoneNumber, PNF.INTERNATIONAL);
    });
};

В приведенном выше коде мы создаем ссылку на экземпляр сторонней библиотеки google-libphonenumber , а затем получаем список объектов напоминания через realm.objects("Reminder") . Затем мы получаем ссылку на последнее напоминание в массиве, поскольку оно является самым последним, и затем преобразуем его данные в номер телефона.

Мы выведем результат этого на консоль, прежде чем фактически записать отформатированную версию данных обратно в область, через:

1
2
3
4
realm.write(function () {
        reminder.name = phoneUtil.format(phoneNumber, PNF.INTERNATIONAL);
    });
};

Сделайте еще один поворот функции, перезапустив ее, и в симуляторе iOS введите номер телефона, который отформатирован не совсем правильно, например, 17187998177 . Через журнал консоли и окончательный вывод в приложение оно должно правильно отформатировать число, используя стороннюю библиотеку, с указанием интервала и международного префикса следующим образом:

+1 718-799 8177

То, что мы видим здесь, это безсерверный способ инициирования события для изменения (вставки) и форматирования данных перед сохранением их в облаке.

В нашей функции панели инструментов мы просто указали на конкретное приложение Realm, RealmDo, но вы также можете определить регулярное выражение (регулярное выражение), чтобы более однозначно различать, какие пути вызывают функцию. Чтобы соответствовать всем Царствам, вы должны использовать .* (Что соответствует нулю или более любого символа). Или вы можете сопоставить пользовательское царство с ^/([0-9a-f]+)/Reminder$ .

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

В этом руководстве вы немного узнали о том, что такое Realm-функции, и как они обеспечивают целостную среду разработки не только для создания и сохранения данных, но и для добавления к ним логики. Мы расширили функцию по умолчанию и вызвали стороннюю библиотеку JavaScript для преобразования телефонных номеров.

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

Пока вы здесь, посмотрите на некоторые другие наши посты по разработке для iOS здесь на Envato Tuts +.

  • стриж
    Что нового в Swift 4
    Патрик Балестра
  • iOS SDK
    Ускоренный вход в систему с паролем автозаполнения в iOS 11
    Патрик Балестра
  • iOS SDK
    15 лучших шаблонов приложений для iOS 2018 года
    Нона Блэкман