NodeREDGuidUKR

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

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

Створення нового користувача та занесення інформації про нього в базу даних

Завдання

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

{
    firstname: "Myname", //Імя
    lastname: "Mylastname", //Прізвище
    midlename: "Mymidlename", //По батькові
    roles:["admin","enduser"], //ролі які є у користувача
    email:"login@mail.org", //поштова адреса
    avatar: "c:/tmp/avatar.png", // розміщення файлу аватарки у локальному сховищі    
    password: "password" //пароль в незакодованому вигляді  
}

Повинна бути реалізована наступна функціональність:

Рішення 1

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

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

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

Застосунок реалізований у вигляді одного потоку, що включає три логічні частини:

image-20230511180053267

Inject виконує роль тестового вузлу, що реалізовувати перевірку різних сценаріїв. Він задає значення userdata у форматі JSON, як це описано в завданні.

image-20230511182408122

Як приклад, його зміст може бути таким:

{
    "firstname": "Myname",
    "lastname": "Mylastname",
    "midlename": "Mymidlename",
    "roles": [
        "admin",
        "enduser"
    ],
    "email": "login@mail3.org",
    "avatar": "C:/tmp/imgs/1683744936871horse01-0.png",
    "password": "password"
}

Далі у вузлі readavatar зчитується файл з аватаркою, який заданий у властивості userdata.avatar.

image-20230511182421620

Отримані прочитані дані зберігаємо у тій же властивості змінної потоку, звідки брали адресу файлу.

image-20230511182437302

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

image-20230511182453290

Даний фільтр використовується вузлом getfromdb для пошуку усіх документів, що відповідають даній умові у колекції users бази даних myatlas (налаштування конфігураційного вузла такі самі як у попередньому прикладі).

image-20230511182505906

Якщо хоч один документ що задовольняє даному прикладу знайдений, вузол поверне масив документів, що свідчить про наявність користувача в базі (по факту не має бути більше ніж одного). Якщо документ не знайдено, то вузол switch перенаправить потік по першому шляху, якщо знайдено - по другому, де він закінчується вузлом з повідомленням.

image-20230511182519206

Якщо документів немає починається частина шифрування та запису. Для початку дані користувача копіюються в msg.payload:

image-20230511182532740

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

image-20230511182553792

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

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