...

Пример использования Storage

Тема в разделе "Примеры сценариев", создана пользователем vyimova, 31 авг 2023.

  1. vyimova

    vyimova Участник

    Порой возникает потребность хранить и использовать данные на стенде где-то помимо справочников. Одним из вариантов хранения может служить кэш/хранилище стенда.

    Подробнее про них можно прочитать в статье «Запись и получение данных из хранилищ Storage и cache».

    Здесь же рассмотрим пример использования Storage для текущего пользователя.

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

    Учитывая формат хранения данных в хранилище в знакомом всем виде «ключ-значение», можно использовать в качестве ключа id пользователя, а в качестве значения – ту информацию, которая нужна пользователю и которую будем хранить и выводить.

    Функции для записи информации в хранилище и считывания из него можно изучить в tssdk.

    Прежде всего нужно заполнить хранилище. Это можно сделать через бизнес-процесс, страницу и т.д. Здесь воспользуемся Методом API в модуле. Код Метода API будет следующим:
    Код:
    
    // объект пользовательских данных
    interface UserObject {
        
    idUserstring;
        
    infoForStoragestring;
    }

    // метод для записи данных в хранилище
    async function setInStorage(reqFetchRequest): Promise<HttpResponse void> {
        const 
    response = new HttpResponse();
        try {
            if (
    req.body) {
                
    // получение из body данных
                
    const paramsUserObject JSON.parse(req.body.toString());

                
    let idUser params.idUser;
                
    let infoForStorage params.infoForStorage;

                
    // запись в хранилище полученных данных в качестве ключа и значения
                
    await Global.ns.russianPost.storage.setItem(idUserinfoForStorage);

                
    response
                    
    .status(200)
                    .
    json({
                        
    msg: `Успешно помещен текст в storage`
                    })
                    .
    set('Content-Type''application/json');
            }
            else {
                
    // в случае отсутствия query
                
    response
                    
    .status(400)
                    .
    json({
                        
    msg: `Ошибка в синтаксисе запроса`
                    })
                    .
    set('Content-Type''application/json');
            }
        }
        catch (
    err) {
            
    // в случае возникновения какой-либо ошибки
            
    response
                
    .status(500)
                .
    json({
                    
    msg: `Внутренняя ошибка сервера: ${err}`
                })
                .
    set('Content-Type''application/json');
        }
        return 
    response;
    }
    Затем вызовем в Postman созданный нами метод, указав в «Body – raw» следующий JSON:
    Код:
    
    {
    "idUser""<ID_USER>",
    "infoForStorage""Содержимое кэша"
    }
    В поле «idUser» помещаем значение id пользователя, для которого будем хранить и выводить информацию. Данные, которые будем хранить, запишем в поле «infoForStorage».

    Далее создадим в разделе страницу, куда будем выводить информацию. Перейдем в ее конструктор и вынесем на форму виджет-код со следующим содержимым:
    Код:
    
    <div class="user-data"></div>

    <
    script>
        $(
    document).ready(function(){
            <%= 
    Scripts%>.renderPage();
        });
    </script>


    Далее перейдем на вкладку «Сценарии» и напишем следующий клиентский сценарий:
    Код:
    
    // объявление необходимых констант и переменных
    declare const consoleany;
    declare const 
    windowany;
    declare const 
    documentany;

    let userCheckElany;

    // проверка загрузки элемента для вывода данных
    async function renderPage(){
        
    console.log("Рендер");
        
    let myInterval window.setInterval(async() => {
            
    userCheckEl document.querySelector('.user-data');
            if (
    userCheckEl) {
                
    window.clearInterval(myInterval);
                
    await getData();
            }
        }, 
    200);
    }

    // функция для получения и вывода данных хранилища
    async function getData(){
        
    // запись строки с обозначением дальнейшего вывода кэша пользователя
        
    var start document.createElement("p");
        
    start.innerHTML "Кэш:";
        
    userCheckEl.appendChild(start);

        
    // элемент для вывода содержимого кэша
        
    var storageInfo document.createElement("p");
        
    // получение id текущего пользователя для поиска соответствующего содержимого кэша по id как по ключу
        
    var key = (await System.users.getCurrentUser()).data.__id;
        if (!
    key) {
            return;
        }
        
    // получение значения по ключу
        
    var value await Namespace.storage.getItem(key);
        if (!
    value) {
            return;
        }
        
    // вывод содержимого кэша пользователя
        
    storageInfo.innerHTML value;
        
    userCheckEl.appendChild(storageInfo);
    }
    Откроем страницу, куда выводим данные. Если все сделали верно, то зайдя на страницу под нужным пользователем, на странице выведутся данные, которые были отправлены в запросе.

    [​IMG]

    Если зайдем под каким-либо другим пользователем, то эти данные на той же странице для него отображаться не будут.

    [​IMG]

    Таким образом рассмотрели один из вариантов работы с хранилищем стенда Storage.