NodeREDGuidUKR

ДОВІДНИК З NODE-RED українською мовою

До збірника задач

Перегляд даних у вигляді HTML таблиці

Автор: Олександр Пупена

Завдання

Написати фрагмент програми на Node-RED, який буде:

Рішення 1

У даному рішенні використовуються:

Зверніть увагу, що для простоти завдання рішення не передбачає фрагментацію списку файлів на кілька сторінок, тому при великій кількості даних буде надто перевантажувати як клієнта так і сервера. Також в задачі не передбачається формування негативних відповідей.

Пререквізити

Для перевірки даної роботи необхідні дані що збережені в CSV файлі та посилаються на файли зображень. Для цього рекомендується виконати завдання з відправки даних в Node-RED за допомогою форми.

Генерування HTML-коду

Про роботу з таблицями в форматі HTML можна почитати за цим посиланням. У загальному формат виведення має бути приблизно таким:

image-20230511115134933

При цьому код HTML буде мати такий формат:

<!DOCTYPE html>
<html>
<head>
	<style>
        table {font-family: arial, sans-serif;border-collapse: collapse;width: 100%;}
        td, th {border: 1px solid #dddddd;text-align: left; padding: 8px;}
        tr:nth-child(even) {background-color: #dddddd;}
    </style>
</head>
<body>
    <h2>Рисунки з бази:</h2>
    <table>
        <tr>
            <th>Опис</th>
            <th>Рисунок</th>
        </tr>
        <tr>
            <td>Бріард</td>
            <td><img src="https://upload.wikimedia.org/wikipedia/commons/6/60/Briard_fauve.JPG" width="100" height="100"></td>
        </tr>
        <tr>
            <td>Німецька вівчарка</td>
            <td><img src="https://upload.wikimedia.org/wikipedia/commons/4/4f/Berger_allemand_en_montagne.jpg" width="100" height="100"></td>
        </tr>
    </table>
</body>
</html>

Можна спробувати цей код, замінивши його в цьому прикладі.

У нашому випадку необхідно щоб кожен рядок таблиці формувався динамічно в залежності від елементів масиву, в якому буде розміщено текст та посилання на рисунок. Припустимо, що масив буде передаватися як властивість payload, а елементи масиву будуть об’єктами:

{
	"description":"Опис рисунку",
	"filename":"назваФайлу"
}

У цьому випадку, скористувавшись синтаксису Mustache матимемо наступний шаблон:

<!DOCTYPE html>
<html>
<head>
	<style>
        table {font-family: arial, sans-serif;border-collapse: collapse;width: 100%;}
        td, th {border: 1px solid #dddddd;text-align: left; padding: 8px;}
        tr:nth-child(even) {background-color: #dddddd;}
    </style>
</head>
<body>
    <h2>Рисунки з бази:</h2>    
	<table>
        <tr>
            <th>Опис</th>
            <th>Рисунок</th>
        </tr>
        
        <tr>
            <td></td>
            <td><img src="/img/" width="100" height="100"></td>
        </tr>
        
    </table>
</body>
</html>    

Таким чином, через секцію `` буде створено стільки рядків, скільки буде елементів масиву payload, а комірки будуть посилатися на відповідні властивості payload.

Зверніть увагу, що payload.filename очікується назва файлу, до якої добавляється префікс /img/, для того щоб формувати відносний шлях URL до файлу зображення. Тобто якщо payload.filename є рівним 1683744936871horse01-0.png то src="/img/1683744936871horse01-0.png".

Створення фрагменту застосунку Node-RED

Програма в Node-RED включає два потоки:

image-20230511133429278

Перший потік формує HTML зміст на запит сторінки за кінцевою точкою /imgsviev.

image-20230511133650123

Таким чином, набравши на локальному вузлі адресу http://127.0.0.1:1880/imgsviev користувач отримає у відповідь те що надійде на вузол http responce. При надходженні запиту спочатку вузол читання файлу з іменем readcsv завантажує файл зі списком за вказаним в налаштуваннях вузлу шляхом:

image-20230511133952162

Файл який зчитується має наступну структуру:

image-20230510215714665

Як видно, назви файлу містять абсолютний шлях розміщення, задля безпеки видалимо статичну частину шляху і залишимо виключно назву файлу. Для цього скористаємося вбудованою функцією chsnge вузла change , куди передається зміст прочитаного файлу.

image-20230511134213841

Очищений зміст файлу необхідно перетворити з форму CSV в об’єкт, для чого скористуємося вузлом csv з групи parser. У якості назв властивостей вкажемо description та filename, оскільки саме вони задані у шаблоні наступного вузлу. Зверніть увагу на наступне:

image-20230511134705524

Наступний в потоці стоїть вузол template, який наповнений шаблоном, який наведений в пункті вище:

image-20230511135541982

На виході буде формуватися готова сторінка HTML.

При завантаженні сторінки рендер браузера знаде посилання на файли зображень, на кшталт /img/1683744936871horse01-0.png. Тому він буде формувати запит за цим шляхом, який обробляє другий потік.

image-20230511133429278

Для цього означена кінцева точка в форматі /img/*, що значить приймати усі запити що починаються з /img/:

image-20230511140536513

Далі у вузлі change назва шляху записується в msg.filename, щоб прочитати цей файл. Друга частина URL (після /img/) вказуватиме не назву файлу розміщення, а першу частину, тобто/img/ треба замінити на дійсний шлях розміщення файлів.

image-20230511140757674

Після чого вузол readimg читає запитуваний файл та передає у відповіді.

image-20230511141210731

Експорт потоку доступний за посиланням