IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

2. diel - Real-time kniha návštev - Databáza a CRUD

V minulej lekcii, Real-time kniha návštev - Príprava prostredia pre projekt , sme si urobili kratučký úvod do Node.js, zoznámili sa s novým projektom a nainštalovali si prvé potrebný balíček pre projekt.

V tejto lekcii sa zameriame na server a jeho prístup do databázy.

Databázy

Pre správu databázy budeme potrebovať softvér MongoDB Compass, ak ho ešte nemáte stiahnite si ho a nainštalujte. Po úspešnom stiahnutí a inštalácii budeme ešte potrebovať vytvoriť nový klaster. To docielime pomocou MongoDB Atlasu. Na ten sa dostaneme zapnutím Compass a stlačením na tlačidlo Create Free Cluster vpravo:

Node.js - Real-time kniha návštev

Klikneme na zelené tlačidlo GET STARTED FREE a založíme si účet. Po registrácii by sme mali byť na tejto stránke:

Node.js - Real-time kniha návštev

Klikneme vpravo na tlačidlo Create a Cluster. Potom budeme mať na výber poskytovateľa a región. Vyberte ľubovoľne, odporúčam vybrať najbližšie k vášmu bydlisku, napr. Ireland od poskytovateľa AWS. Úplne na konci si budeme môcť pomenovať tento Cluster zadarmo. Názov budeme vyberať v zozname klastrov, ale ak budeme používať iba FREE verziu (čo v rámci kurzu budeme), jednoducho cluster rozpoznáme. Nakoniec klikneme na tlačidlo dole Create a Cluster. Teraz sa nám bude vytvárať a konfigurovať databázy, čo môže zabrať niekoľko minút. Po chvíľke sa všetko pripraví:

Node.js - Real-time kniha návštev

Pre pripojenie ku klastra budeme potrebovať tzv. Connection String. Ten získame v Atlasu kliknutím na tlačidlo Connect. Teraz si musíme nastaviť zabezpečenie, kto sa bude môcť pripojiť do našej databázy. Pre jednoduchosť môžeme vložiť súčasnú IP adresu kliknutím na tlačidlo Add Your Current IP Address a potom potvrdiť kliknutím na tlačidlo Add IP address. Ak nemáte statickú IP od poskytovateľa a mení sa, budete musieť túto IP neustále meniť alebo nastavte prístup odkiaľkoľvek kliknutím na Allow Access from Anywhere:

Node.js - Real-time kniha návštev

Ako druhý krok musíme vytvoriť prihlasovacie meno a heslo. Zvoľte podľa ľubovôle ale údaje si niekam napíšte alebo pamätajte. Užívateľa vytvoríme tlačidlom Create Database User. Nakoniec môžeme konečne zvoliť metódu pre pripojenie tlačidlom vpravo dole Choose a connection method. Klikneme na poslednú možnosť Connect using MongoDB Compass a tlačidlom Copy alebo ručne skopírujeme Connection String. Skopírovanú URL vložíme do Compass (samozrejme nezabudnime nahradiť <password> svojim heslom). URL bude vyzerať napríklad takto:

mongodb+srv://itnetwork:[email protected]/test

Teraz by sme sa mali tlačidlom CONNECT dostať do správy klastra. Teraz vytvoríme novú databázu a to cez tlačidlo CREATE DATABASE, pomenovať ju môžeme ako chceme, ja ju pomenujem ITnetwork. Druhé textové pole je názov pre kolekciu (kolekcia v MongoDB je niečo ako tabuľka v MySQL), tú pomenujeme treba posts. V tejto chvíli nemáme v kolekcii posts nič, to hneď napravíme. Klikneme na kolekciu posts a potom na tlačidlo ADD DATA > Insert Document vložíme toto:

{
"name": "2tix",
"email": "[email protected]",
"message": "Ahoj",
"date": "26. 1. 2021"
}

Dokument vložíme do databázy.

Dáta sú uchovávané vo formáte JSON (J ava S Cripta O bject N otation). Ak sme všetko urobili správne, mala by naša kolekcia vyzerať takto:

MongoDB kolekcia - Node.js - Real-time kniha návštev

Server

Databáze máme síce hotovú, my do nej ale budeme chcieť zapisovať z JavaScriptu. Otvoríme si teda zložku Server v našom projekte a tu vytvoríme nový súbor server.js. Otvoríme ho a hneď na začiatku definujme konštantu url, tá bude uchovávať connection string z MongoDB (spôsob jeho získania bude rovnaký ako u Compass, len miesto Connect using MongoDB Compass, zvolíme Connect your application):

const url = "mongodb+srv://itnetwork:<password>@itnetworkcluster.y8exk.mongodb.net/<dbname>?retryWrites=true&w=majority";

<password> zase nahradíme svojím heslom au konca <dbname> nahradíme názvom našej databázy (u mňa ITnetwork):

const url = "mongodb+srv://itnetwork:[email protected]/ITnetwork?retryWrites=true&w=majority";

Pre prístup do MongoDB musíme ešte nainštalovať knižnicu príkazom:

npm i mongodb --save

Teraz túto knižnicu využijeme, uložíme si jej do konštanty:

const MongoClient = require("mongodb").MongoClient;

K databáze sa pripojíme pomocou:

MongoClient.connect(url,(err,client) => {

});

Funkcia connect berie ako prvý argument Connection string a ako druhý funkciu (callback). Náš callback má tiež dva argumenty - err (chybu) a client, cez tento objekt sa budeme pripájať k databáze. Do callbacku vložme nasledujúci kód:

MongoClient.connect(url,(err,client) => {
    if(err) throw err;
    console.log("Database connected...");
    const posts = client.db("ITnetwork").collection("posts");
});

Prvý riadok vyhodí chybu, ak nejaká je. Druhý nám vypíše, že je server pripojený k databáze a tretí získa kolekciu posts z databázy ITnetwork a uloží ju do konštanty posts.

Čítania

Ak skúsime vypísať kolekciu takto:

console.log(posts);

Aplikácia vypíše veľa dlhý objekt, ktorý rozhodne nezodpovedá tomu, čo v kolekcii máme. Pre správny výpis všetkých dokumentov v kolekcii použijeme:

posts.find().toArray((err, data) => {
      if (err) throw err;
      for(const doc of data){
         console.log(doc);
      }
   });

Tu posts.find().toArray() dáva funkciu, ktorú berie ako argument premennú data, teda list všetkých dokumentov v kolekcii. My potom vo cykle for-of vypíšeme všetky tieto dokumenty.

Celý náš kód bude teda vyzerať takto (URL si zmeňte na svoju):

const url = "mongodb+srv://itnetwork:[email protected]/ITnetwork?retryWrites=true&w=majority";

const MongoClient = require("mongodb").MongoClient;

MongoClient.connect(url,(err,client) => {
    if(err) throw err;
    console.log("Database connected...");
    const posts = client.db("ITnetwork").collection("posts");

    posts.find().toArray((err, data) => {
      if (err) throw err;
      for(const doc of data){
         console.log(doc);
      }
   });
});

Teraz si aplikáciu skúsime príkazom node server.js z priečinka Server/. Aplikácia vypíše niečo takéto:


Database connected...
{
  _id: 600fd6dc545496255c10b83c,
  name: '2tix',
  email: '[email protected]',
  message: 'Ahoj',
  date: '26. 1. 2021'
}

Všimnime si, že nám MongoDB pridala do dokumentu _id (to budete mať samozrejme odlišné), ktoré slúžia k indexáciu dokumentov. Ešte než sa vrhneme na zápis do databázy, pozrime sa bližšie na funkciu find(). My ju tu používame bez parametrov, ale ak chcete napríklad zobraziť len správy vytvorené dňa 26. 1. 2021, môžeme správy filtrovať:

posts.find({date: "26. 1. 2021"}).toArray((err, data) => {
      if (err) throw err;
      for(const doc of data){
         console.log(doc);
      }
   });

Ak chceme nájsť v databáze len jeden dokument, môžeme použiť funkciu findOne():

posts.findOne({date: "26. 1. 2021"}, (err,doc) => {
      if (err) throw err;
      if(doc) console.log(doc);
      else console.log("Document was not found!");
   });

Zapisovanie

Zápis do databázy prevedieme metódou posts.insertOne():

posts.insertOne({
      name: "John Doe",
      email: "[email protected]",
      message: "Ahojky",
      date: "26. 1. 3021"
   });

Skúsme znova zapnúť server.js.

Ak sa teraz pozrieme do Compass, môžeme vidieť, že sa náš dokument naozaj vložil. Ak sa nový záznam nepridal, skúste najskôr aktualizovať databázu kliknutím na tlačidlo Refresh úplne napravo v MongoDB Compass.

Editácia

Dáta v databáze budeme upravovať podobne, ako vkladať:

posts.update({
        name: "John Doe"
    }, {
        $set: {
            name: "2tix"
        }
    });

Prvý argument metódy update() je filter (funguje rovnako ako u metódy insert() / insertOne()), druhý je objekt obsahujúci ďalší objekt $set, do ktorého vždy píšeme, aký z atribútov dokumentu chceme zmeniť a na čo. Opäť tu môžeme použiť metódu updateOne(), jediný rozdiel je, že metóda updateOne() upraví len prvý nájdený dokument.

Odstraňovanie

Na odstraňovanie slúži metóda deleteMany(). Tá je asi najjednoduchšie, pretože berie len jeden argument - filter (opäť úplne rovnaký ako u metód update() a insert()):

posts.deleteMany({
        name: "2tix"
    });

A aj tu sa dá použiť metóda deleteOne():

posts.deleteMany({
        name: "2tix"
    });

Funkcia then()

Na všetkých metódach MongoDB (find() / insert() / update() / delete()) môžeme zavolať funkciu .then(), ktorá opäť berie ako argument callback:

posts.deleteOne({name: "2tix"}).then(() => {
   console.log("Deleted...");
});

Záver

V tejto lekcii sme sa naučili vytvárať MongoDB databázu a používať CRUD operácie (C reate - insert(), R ead - find(), U pdate - update(), D élet - delete()). Celý dnešný kód by mal vyzerať nasledovne:

const url = "connectionString";
const MongoClient = require("mongodb").MongoClient;

MongoClient.connect(url, {useUnifiedTopology: true}, (err, client) => {
    if (err) throw err;
    console.log("Database connected...");
    const posts = client.db("ITnetwork").collection("posts");
    posts.find({date: "26. 1. 2021"}).toArray((err, data) => {
        if (err) throw err;
        for (const doc of data) {
            console.log(doc);
        }
    });
    posts.insertOne({
       name: "John Doe",
       email: "[email protected]",
       message: "Ahojky",
       date: "26. 1. 3021"
    });
    posts.updateOne({
        name: "John Doe"
    }, {
        $set: {
            name: "2tix"
        }
    });
    posts.deleteOne({name: "2tix"}).then(() => {
        console.log("Deleted...");
    });
    posts.findOne({date: "26. 1. 2021"}, (err,doc) => {
       if (err) throw err;
       if(doc) console.log(doc);
       else console.log("Document was not found!");
    });
});

V ďalšej lekcii, Real-time kniha návštev - Server , si naprogramujeme náš server v Node.js pomocou Socket.io.


 

Predchádzajúci článok
Real-time kniha návštev - Príprava prostredia pre projekt
Všetky články v sekcii
Node.js - Real-time kniha návštev
Preskočiť článok
(neodporúčame)
Real-time kniha návštev - Server
Článok pre vás napísal Lukáš Michalik
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
jako Autor se věnuje C#, tvorbě her v C++ a JavaScriptu
Aktivity