Quest: API w Node.js

Wersja początkowa – łatwa

Zadanie polega na zbudowaniu, uruchomieniu i przetestowaniu prostego CRUD API. Załóżmy że chcemy przechowywać w bazie danych informacje o produktach (nazwa, opis, cena). Spośród dostępnych narzędzi proponuję wybrać:

  • Node.js + Express.js + MongoDB + mongoose lub
  • Node.js + Express.js + MySQL + mysql (jeśli wolisz bazę relacyjną).

Dane będziemy przekazywać i odbierać jako json.

Proste rozwiązanie dla MySQL (made by AI, tested by PK)

Zainstaluj wymagane zależności:

npm init -y
npm install express mysql

Utwórz bazę w MySQL (np w XAMPP przez PhpMyAdmin)
Stwórz plik app.js z następującą zawartością:

const express = require('express');
const mysql = require('mysql');

// Tworzenie aplikacji Express
const app = express();

// Middleware do parsowania JSON (Express ma wbudowany parser JSON od wersji 4.16)
app.use(express.json());

// Konfiguracja połączenia z bazą danych
const db = mysql.createConnection({
    host: 'localhost',
    user: 'root', // Zmień na swojego użytkownika
    password: '', // Ustaw swoje hasło
    database: 'products_db', // Ustaw nazwę swojej bazy danych
});

// Połączenie z bazą danych
db.connect((err) => {
    if (err) {
        console.error('Błąd połączenia z bazą danych:', err.message);
        return;
    }
    console.log('Połączono z bazą danych MySQL.');
});

// Tworzenie tabeli w bazie danych (jeśli nie istnieje)
const createTableQuery = `
    CREATE TABLE IF NOT EXISTS products (
        id INT AUTO_INCREMENT PRIMARY KEY,
        name VARCHAR(255) NOT NULL,
        description TEXT,
        price DECIMAL(10, 2) NOT NULL
    );
`;
db.query(createTableQuery, (err) => {
    if (err) throw err;
    console.log('Tabela "products" została utworzona.');
});

// Endpointy API

// 1. Pobierz wszystkie produkty
app.get('/products', (req, res) => {
    const query = 'SELECT * FROM products';
    db.query(query, (err, results) => {
        if (err) {
            res.status(500).send(err.message);
            return;
        }
        res.json(results);
    });
});

// 2. Pobierz produkt po ID
app.get('/products/:id', (req, res) => {
    const query = 'SELECT * FROM products WHERE id = ?';
    db.query(query, [req.params.id], (err, results) => {
        if (err) {
            res.status(500).send(err.message);
            return;
        }
        if (results.length === 0) {
            res.status(404).send('Produkt nie został znaleziony.');
            return;
        }
        res.json(results[0]);
    });
});

// 3. Dodaj nowy produkt
app.post('/products', (req, res) => {
    const { name, description, price } = req.body;
    const query = 'INSERT INTO products (name, description, price) VALUES (?, ?, ?)';
    db.query(query, [name, description, price], (err, result) => {
        if (err) {
            res.status(500).send(err.message);
            return;
        }
        res.status(201).send({ id: result.insertId, name, description, price });
    });
});

// 4. Aktualizuj produkt
app.put('/products/:id', (req, res) => {
    const { name, description, price } = req.body;
    const query = 'UPDATE products SET name = ?, description = ?, price = ? WHERE id = ?';
    db.query(query, [name, description, price, req.params.id], (err, result) => {
        if (err) {
            res.status(500).send(err.message);
            return;
        }
        if (result.affectedRows === 0) {
            res.status(404).send('Produkt nie został znaleziony.');
            return;
        }
        res.send('Produkt został zaktualizowany.');
    });
});

// 5. Usuń produkt
app.delete('/products/:id', (req, res) => {
    const query = 'DELETE FROM products WHERE id = ?';
    db.query(query, [req.params.id], (err, result) => {
        if (err) {
            res.status(500).send(err.message);
            return;
        }
        if (result.affectedRows === 0) {
            res.status(404).send('Produkt nie został znaleziony.');
            return;
        }
        res.send('Produkt został usunięty.');
    });
});

// Uruchomienie serwera
const PORT = 3000;
app.listen(PORT, () => {
    console.log(`Serwer działa na porcie ${PORT}`);
});

Testowanie

  1. Możesz utworzyć testową aplikację JS która będzie pobierała dane z API (np: strona z przyciskami, z których każdy uruchamia odpowiednią funkcję API i powoduje wyświetlenie komunikatu z potwierdzeniem i danymi zwrotnymi)
  2. lub użyć gotowych narzędzi do testowania API. Proponuję Postman. W wersji bezpłatnej, bez zakładania konta, można wykonać wszystkie testy. Aby na przykład dodać dane do bazy za pomocą Postman:
    • Wybierz metodę POST.
    • Wprowadź URL: http://localhost:3000/products.
    • Przejdź do zakładki Body, wybierz opcję raw i jako format wybierz JSON. Wklej:
      { "name": "Produkt A", "description": "Opis produktu A", "price": 99.99 }
    • Kliknij Send.

Zadanie poszerzone

Przetestuj działanie aplikacji i zrozum jej działanie. Poeksperymentuj! Wybierz, które elementy chcesz poprawić:

  1. Rozbij plik z kodem na mniejsze, by poprawić porządek i skalowalność.
  2. Dodaj kolejne endpointy i kolejną tabelę w bazie (np. z zakupami i sprzedażami).
  3. Poczytaj o bezpieczeństwie API i rozbuduj je np. o autoryzację i obsługę tokenów JWT.

Twój komentarz

Zapisz moje dane, adres e-mail i witrynę w przeglądarce aby wypełnić dane podczas pisania kolejnych komentarzy.