Используем Webix Remote с Node.js

Из этой статьи вы узнаете как использовать Webix Remote для интеграции библиотеки Webix и Node.js.

Как установить

Чтобы установить Webix Remote, выполните следующую команду:

npm install webix-remote

Как подключить на сервере

В код необходимо подключить модуль "webix-remote".

После чего создайте сервер: вызовите метод server() у объекта remote, как показано ниже.

var remote = require("webix-remote");
var api = remote.server();

Теперь вы можете пользоваться методами сервера.

Например, метод setMethod() поможет зарегестрировать серверные методы для дальнейшего их использования на клиенте. Метод принимает 2 параметра:

  • name (string) - имя, под которым метод будет зарегистрирован
  • function (function/object) - метод(ы), зарегистрированные под этим именем (name)

Давайте применим метод setMethod для функции add, которая будет суммировать два числа.

// регистрируем функцию "add" 
api.setMethod("add", function(a,b){
   return a,b;
});

Теперь вы можете вызывать зарегистрированную функцию с клиента.

Как подключить на клиенте

На клиенте необходимо подключить путь к серверному API после webix.js файла:

<script src='webix.js'></script>
<script src='/api'></script>

Чтобы обратиться к серверному методу, необходимо вызвать webix.remote.methodName.

Давайте отправим запрос на сервер и попросим функцию add вернуть сумму двух чисел. Запишем результат операции в переменную result:

var result = webix.remote.add(1,2);
// или используя метод then() 
webix.remote.add(1,2).then(result){
    alert(result);
});

Webix Remote загружает данные асинхронно. Клиент сперва получает промис, а реальные данные приходят позже. В нашем примере переменная result это промис с данными. Использование промисов позволяет избежать задержек при отрисовке страницы.

Вы также можете загрузить данные синхронно. Для этого используйте метод sync():

var result = webix.remote.add(1,2).sync();

Как передать дополнительные параметры

Если вам нужно передать дополнительные параметры в серверную функиию, используйте параметр $req*, который будет содержать все необхлжимый параметры. Например, серверный код может выглядеть следующим образом:

api.setMethod("add", function(a,b,$req){
    return a+b+$req.session.userBonus;
});

Клиентский код может выглядеть так:

webix.remote.add(1,2);

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

Как указать статические данные

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

Чтобы указать статические данные, используйте метод setData() и передайте в него 2 аргумента:

  • name (string) - имя параметра, который будет задан как статический
  • handler (function) -функция, которая получит объект запроса и вернёт результат

Например, на сервере мы определяем параметр "$user". Функция, указанная вторым параметром, получит объект запроса и вернёт ID пользователя:

api.setData("$user", function(req){
    return req.user.id;
});

Вы также можете передать какое-либо значение, в качестве второго параметра:

api.setData("$user",1);

В этом случае метод генерации данных будет вызвать лишь раз - при инициализации API.

На клиенте данные доступны следующим образом:

var user = webix.remote.$user;

Уровень доступа API

Webix Remote даёт возможность ограничить доступ к API согласно уровню доступа пользователя. Это значит, что пользователь сможет использовать только те методы, которые доступны его уровню доступа.

Для реализации такого поведения в момент создания метода необходимо задать роль, которая позволит использовать этот метод:

api.setMethod("role@method_name", function(){
   // ваш код
});

Например, вы можете ограничить доступ к функции "add" всем ролям кроме администратора (admin).

api.setMethod("admin@add", function(a,b){
    return a+b;
});

Уровни доступа описываются с помощью модификатора в объекте req.session:

  • все методы, у которых не указан модификатор доступа, по умолчанию доступны всем
  • при req.session.user доступны методы для модификатора "user"
  • при req.session.user.role доступны методы для определённой роли

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

req.session = { user: { role:"admin,levelB"}}

В этом случае, функция add будет доступна пользователям с модификаторами "user", "user.role=admin" и "user.role=levelB". Для пользователей с другой ролью этот метод будет недоступен:

api.setMethod("user@add1", (a,b) => a+b ); // доступен
api.setMethod("admin@add2", (a,b) => a+b ); // доступен
api.setMethod("levelC@add3", (a,b) => a+b ); // недоступен

Пользовательская логика уровней доступа

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

api.$access = function(req){
    return { 
        user : !!req.user,
        admin: req.user && req.user.id == 1 
    };
};

Этот код проверит, существует ли пользователь и задана ли ему роль администратора.

Наверх