💾 Spuštění Sqlite s wait/async a expressjs/polkajs

❗❗❗❗ Tento blogový příspěvek je inspirován naší prací na našem živém twitch streamu. Pokud chcete sledovat, jak tam pracujeme na vytváření blogu ve svelte3, nebo možná máte nějaké otázky ohledně vývoje webu? Každá otázka je vítána a neexistují žádné hloupé otázky! Pokusím se na ně odpovědět, jak nejlépe dovedu! Na stránku twitch se dostanete kliknutím 👉sem👈.

Úvod

SQLite je od mnoha velkých společností jako Google, Mozilla nebo Facebook. Aplikace pro Android a iOS jej používají jako místní databáze. Používá se ve vestavěných zařízeních, jako je BMW iDrive. Byl dokonce nalezen v malwaru jako Flame. Jak tedy vidíte, SQLite lze použít v mnoha situacích a produktech!

Požadavky

  • Nainstalovali jste NodeJS a NPM v jejich nejnovější verzi nebo alespoň s podporou Async/Await.
  • Základní znalosti SQL. Základní! Nebudeme zde dělat nic přepychového
  • Základní pochopení funkce Async/Await. Doporučuji přečíst si můj článek o Async/Await
  • Všechny příkazy budou příkazy Unix, pokud je chcete spouštět v systému Windows, musíte je změnit na verze systému Windows. Vřele doporučuji WSL.

Nastavení

První věc, kterou musíme udělat, je inicializovat nový projekt NPM. Pojďme vytvořit nové git repo a inicializovat NPM.

mkdir sqlite-expressjs-async-await-blogpost
cd sqlite-expressjs-async-await-blogpost
git init
npm init -y

Tím se vytvoří složka s názvem SQLite-expressjs-async-await-blogpost . Poté změníme adresář na právě vytvořený a inicializujeme git a vytvoříme nový package.json s npm init příkaz. -y znamená ano přijmout vše.

Nyní, když máme náš projekt inicializovaný, pojďme nainstalovat potřebné balíčky NPM.

npm i --save polka sqlite-async

polka je extrémně minimální, vysoce výkonná alternativa Express.js. Pokud znáš expressjs, tak jsi padl jako doma. Používáme sqlite-async Zde je balíček NPM místo sqlite nebo sqlite3 protože jako můžete vidět balíček podle názvu, který podporuje async/await po vybalení, a my nepotřebujeme dělat nějaké voodoo, aby to fungovalo.

Běžící polka

Musíme vytvořit vstupní bod pro naši aplikaci.

touch server.js

Tím se ve složce vytvoří soubor server.js a nyní můžeme konečně použít editor kódu.
Nejprve zkusíme začít polku!

// server.js
const polka = require('polka');

polka()
    .get('/', (req, res) => {
        res.end('<h1>hello world</h1>');
    })
    .listen(3000, err => {
        if (err) throw err;
        console.log(`> Running on localhost:3000`);
    });

Nejprve potřebujeme vyžadovat polka a pak vytváříme trasu nazvanou / . Toto je kořenová trasa a prohlížeč to obvykle nezobrazuje v adresním řádku, když jste například na localhost:3000 správná adresa je:http://localhost:3000/ ale kdo to chce napsat správně? Vše, co jsme popsali, se provádí pomocí get() funkce. listen() funkce říká polce, aby poslouchala port 3000 a druhý argument je zpětné volání, které se spustí při spuštění serveru. Můžete změnit 3000 na co chcete! Můžete být dokonce hacker a spustit to na 1337 . Nyní si můžete zavolat na Elite;)

Ale jak ten server spustit? To je snadné!
V terminálu, který je ve složce projektu, můžete zadat:

node server.js

Tento příkaz spustí polku a můžete přejít na localhost:3000 a měli byste vidět velké tlusté hello world !

Vytvoření prázdné databáze

Nyní, když víme, že můžeme provozovat náš server, můžeme nastavit SQLite.

Mějte na paměti, že nepoužíváme žádné efektní automatické načítání našeho serveru. Po každém uložení jej musíte vypnout a znovu spustit. To provedete stisknutím CTRL+C v terminálu, kde běží server a poté jej znovu spusťte pomocí node server.js .

// server.js
const Database = require('sqlite-async')

Nejprve musíme importovat sqlite-async a nyní musíme přepsat naše server.js trochu, aby to fungovalo s async/wait

// server.js
const main = async () => {
    try {
        db = await Database.open(":memory:");
    } catch (error) {
        throw Error('can not access sqlite database');
    }
    polka()
        .get('/', (req, res) => {
            res.end('<h1>hello world</h1>');
        })
        .listen(3000, err => {
            if (err) throw err;
            console.log(`> Running on localhost:3000`);
        });
}

main();

Pojďme krok za krokem.

polka() jsme nezměnili kód vůbec.
Vše jsme zabalili do funkce tlusté šipky s příkazem async a na konci souboru tuto funkci voláme. Musíme to udělat, aby funkce čekání fungovala.

Pojďme mluvit o této lince:

db = await Database.open(":memory:");

Tato řada je největší novinkou! „Otevíráme“ novou databázi. Funkce skutečně zkontroluje, zda již existuje databáze, pokud ano, pouze se k ní připojí, a pokud nyní databáze existuje, vytvoří novou a poté se k ní připojí. :memory: znamená, že vytváříme naši databázi v paměti RAM počítače a ne někde v systému souborů, jak byste to měli udělat, pokud chcete, aby vaše data přežila pád serveru nebo opětovné načtení! Používáme :memory: tady proto, že je jednodušší uklízet, protože nemusíte uklízet vůbec;).
Takže když se to podaří, máme připojení k naší databázi!
try/catch je tam, protože nodejs se zhroutí, pokud dojde k neošetřené chybě! Vždy používejte try/catch při práci se sliby!

Vytváření prázdné tabulky!

Nyní, když máme databázi, potřebujeme také tabulku. Vytvoříme následující tabulku s názvem user se sloupci:

  • Typ jména TEXT
  • Typ příjmení TEXT
// server.js
// insert that code after the `database.open` try/catch
    try {
        await db.run(`
        CREATE TABLE user (
                    firstName TEXT,
                    lastName TEXT
        )
        `);    
    } catch (error) {
        throw Error('Could not create table')
    }

Kód vytvoří tabulku nazvanou user a tato tabulka bude mít 2 sloupce firstName a lastName typu TEXT.

Vložení některých dat

Nyní do tabulky vložíme nějaká data!

// server.js
// Insert this after the Create table try/catch
    try {
        const insertString = `
            INSERT INTO blogPosts 
            (firstName, lastName)
            VALUES (?,?)
        `;
        await db.run(insertString,
            "Michael",
            "Lazarski"
        );
    } catch (error) {
        throw Error('Could not insert new user');
    }

Dobře, tento dotaz má dvě části. const insertString a skutečný příkaz spuštění s daty, která chceme vložit.

INSERT INTO users(firstName, lastName)

To říká SQLite, že chceme vložit do databáze a první pole je firstName a druhé pole je lastName.

 VALUES (?, ?)

Tato linie je vzrušující. VALUES zde znamená, že musíme specifikovat hodnoty, které chceme do tabulky vložit. Představte si to jako seznam parametrů, který byste předali funkci. Toto má také připojení k users(firtName, lastName) čára. Tady záleží na pořadí! První otazník je v tomto případě křestní jméno a druhý otazník je příjmení. Ale proč ? . Podívejte se znovu na db.run() funkce. Prvním parametrem je náš dotaz. Druhý a třetí jsou opět ve stejném pořadí jako otazníky. Toto má dva skoky. V řádku vložení říkáme, co chceme vložit do VALUES řádku říkáme SQLite, že chceme vložit druhý a třetí parametr db.run() funkce. Je dobré to udělat takto, protože sqlite-async Balíček npm vám také připraví řetězec a escape znaky, které nemůžete vložit tak snadno jako ' nebo jiné speciální znaky.

Konec získávání dat a jejich zobrazování na naší stránce

Nyní musíme požádat o naše data a poté je odeslat zpět klientovi.
Umí to následující kód:

// server.js
// change the .get('/') function
polka()
    .get('/', async (req, res) => {
        const {firstName, lastName} = 
            await db.get("SELECT firstName, lastName FROM user");
        res.end(`<h1>hello ${firstName} ${lastName} </h1>`);
    })

První věc, kterou jsme udělali, je nastavit druhý parametr, kterým je funkce tlusté šipky, asynchronně, abychom mohli použít wait. Můžeme zde použít jednoduchý Select, protože v naší tabulce máme pouze jeden řádek. Znovu vybíráme jméno a příjmení z uživatelské tabulky a protože se vracíme zpět právě k objektu s db.get() funkce, můžeme ji destruovat. Posledním krokem je použití šablonového literálu k vytvoření našeho malého příkladu HTML.

Volitelné:Hledání konkrétního uživatele

Představte si, že nyní máte mnoho uživatelů a chcete najít první Michael ve vaší databázi. K tomu je třeba změnit SELECT trochu.

await db.get(`SELECT firstName, lastName 
                FROM user 
                WHERE firstName LIKE ?`,
                "%Michael%");

Jediná nová věc je zde WHERE a LIKE . To, co zde děláme, je, že hledáme první záznam, kde se naše křestní jméno shoduje s Michael . % před a za znamená, že co Michael může být kdekoli pod tímto jménem. MMichael nebo Michaels například by také odpovídalo.

Konečný kód

Pokud se chcete podívat na finální kód, najdete ho v následujícím repozitáři github

Pomohlo by mi, kdybyste pro mě mohli udělat následující!
Přejděte na Twitch a zanechte mi sledování! Kdyby to udělalo jen pár lidí, pak by to pro mě znamenalo celý svět! ❤❤❤😊

👋Řekněte Ahoj! Instagram | Twitter | LinkedIn | Střední | Twitch | YouTube