Из этой статьи вы узнаете как использовать 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 параметра:
Давайте применим метод 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 аргумента:
Например, на сервере мы определяем параметр "$user". Функция, указанная вторым параметром, получит объект запроса и вернёт ID пользователя:
api.setData("$user", function(req){
return req.user.id;
});
Вы также можете передать какое-либо значение, в качестве второго параметра:
api.setData("$user",1);
В этом случае метод генерации данных будет вызвать лишь раз - при инициализации API.
На клиенте данные доступны следующим образом:
var user = webix.remote.$user;
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: { 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
};
};
Этот код проверит, существует ли пользователь и задана ли ему роль администратора.
Наверх