Nextjs – integracja z mysql

Aby zintegrować bazę danych MySQL z aplikacją Next.js, musisz wykonać kilka kroków. Next.js działa w środowisku Node.js, więc możesz użyć popularnych bibliotek, takich jak mysql2 lub ORM-ów typu `Prisma` czy TypeORM. Poniżej opisuję dwa podejścia: prostsze (z mysql2) i bardziej zaawansowane (z Prisma).

Podejście 1: Użycie biblioteki mysql2
To podstawowe rozwiązanie, które wymaga ręcznego zarządzania połączeniami i zapytaniami SQL.

1. Zainstaluj bibliotekę mysql2
W katalogu projektu Next.js uruchom:

npm install mysql2

2. Skonfiguruj połączenie z bazą danych
Utwórz plik, np. lib/db.js, aby skonfigurować połączenie:

import mysql from 'mysql2/promise';

const dbConfig = {
  host:     process.env.DB_HOST, 
  user:     process.env.DB_USER, 
  password: process.env.DB_PASSWORD, 
  database: process.env.DB_NAME,
};

export async function getConnection() {
  const connection = await mysql.createConnection(dbConfig);
  return connection;
}

3. Użyj bazy danych w API Route
Next.js pozwala tworzyć endpointy API w folderze pages/api. Przykład pliku pages/api/users.js:

import { getConnection } from '../../lib/db';

export default async function handler(req, res) {
  let connection;
  try {
    connection = await getConnection();

    if (req.method === 'GET') {
      // Pobierz użytkowników z bazy
      const [rows] = await connection.execute('SELECT * FROM users');
      res.status(200).json(rows);
    } else if (req.method === 'POST') {
      // Dodaj nowego usera do bazy
      const { name, email } = req.body;
      const [result] = await connection.execute(
        'INSERT INTO users (name, email) VALUES (?, ?)',
        [name, email]
      );
      res.status(201).json({ id: result.insertId, name, email });
    } else {
      res.setHeader('Allow', ['GET', 'POST']);
      res.status(405).end(`Method ${req.method} Not Allowed`);
    }
  } catch (error) {
    res.status(500).json({ error: error.message });
  } finally {
    if (connection) await connection.end(); // Zamknij połączenie
  }
}

– Wywołanie GET /api/users zwróci dane z tabeli users.

Krok 4: Wywołanie API z frontendu

Teraz możesz użyć Fetch API lub biblioteki jak axios, aby komunikować się z API z poziomu komponentów Next.js. Przykładowy komponent:


import { useEffect, useState } from 'react';

export default function Home() {
const [users, setUsers] = useState([]);
const [name, setName] = useState('');
const [email, setEmail] = useState('');

// Pobierz użytkowników
useEffect(() => {
   fetch('/api/users')
   .then((res) => res.json())
   .then((data) => setUsers(data));
  }, []);

  // Dodaj użytkownika
  const handleSubmit = async (e) => {
  e.preventDefault();
   const res = await fetch('/api/users', {
     method: 'POST',
     headers: { 'Content-Type': 'application/json' },
     body: JSON.stringify({ name, email }),
   });
   const newUser = await res.json();
   setUsers([...users, newUser]);
   setName('');
   setEmail('');
 };

  return (
   <div>
     <h1>Użytkownicy</h1>
     <ul>
        {users.map((user) => (
           <li key={user.id}>
             {user.name} - {user.email}
           </li>
        )}
     </ul>
     <form onSubmit={handleSubmit}>
       <input 
         type="text"
         value={name}
         onChange={ e => setName(e.target.value)}
         placaholder="Imię"
       />
      <input 
         type="email" 
         value={email} 
         onChange={ e => setEmail(e.target.value)} 
         placaholder="Email" 
       />     
       <button type="submit">Dodaj</button>
     </form>
   </div>
 );
}



 

4. Zmienne środowiskowe Aby uniknąć wpisywania danych logowania na stałe, użyj pliku .env.local:

DB_HOST=localhost
DB_USER=twoj_user
DB_PASSWORD=twoje_haslo
DB_NAME=twoja_baza

Zaktualizuj lib/db.js:

import mysql from 'mysql2/promise';

const dbConfig = {
    host: process.env.DB_HOST,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_NAME,
};

export async function getConnection() {
  const connection = await mysql.createConnection(dbConfig);
  return connection;
}

5. Uwagi
– Zarządzaj połączeniami ostrożnie – w produkcji lepiej użyj puli połączeń (mysql.createPool), aby uniknąć wyczerpania limitu połączeń:

const pool = mysql.createPool(dbConfig);

export function getConnection() {
  return pool;
}

Podejście 2: Użycie Prisma (zalecane)
Prisma to nowoczesny ORM, który upraszcza pracę z bazą danych i zapewnia typowanie w TypeScript.

1. Zainstaluj Prisma
W katalogu projektu:

npm install prisma --save-dev
npm install @prisma/client

2. Zainicjuj Prisma
Uruchom:

npx prisma init

To utworzy folder prisma z plikiem schema.prisma i doda .env.

3. Skonfiguruj połączenie z MySQL
Edytuj .env:

DATABASE_URL="mysql://twoj_user:twoje_haslo@localhost:3306/twoja_baza"

W pliku prisma/schema.prisma zdefiniuj model, np.:

datasource db {
  provider = "mysql"
  url = env("DATABASE_URL")
}

generator client {
  provider = "prisma-client-js"
}

model User {
  id Int @id @default(autoincrement())
  name String
  email String @unique
}

4. Zsynchronizuj bazę danych
Jeśli masz istniejącą bazę, użyj:

npx prisma db pull

Jeśli tworzysz nową:

npx prisma migrate dev --name init

5. Użyj Prisma w Next.js
Utwórz plik lib/prisma.js:

import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

export default prisma;

Przykład API Route w pages/api/users.js:

import prisma from '../../lib/prisma';

export default async function handler(req, res) {
  try {
    const users = await prisma.user.findMany();
    res.status(200).json(users);
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
}

6. Użycie w komponentach (Server Components)
W Next.js 13+ z App Router możesz używać Prisma w Server Components:

import prisma from '../lib/prisma';

export default async function UsersPage() {
  const users = await prisma.user.findMany();
  return (
    <ul>
     {users.map((user) => (
        <li key={user.id}>{user.name}</li>
      ))}
    </ul>
  );
}

Porównanie
mysql2: Prostsze, ale wymaga ręcznego pisania SQL i zarządzania połączeniami. Dobre dla małych projektów.
Prisma: Więcej konfiguracji na start, ale oferuje bezpieczeństwo typów, automatyczne migracje i prostszą składnię. Lepsze dla większych aplikacji.

Wdrożenie na VPS z Apache2
– Upewnij się, że MySQL działa na serwerze (np. sudo apt install mysql-server i skonfiguruj bazę).
– Skopiuj projekt na serwer, zainstaluj zależności (npm install) i uruchom aplikację (npm run build && npm run start).
– Skonfiguruj Apache2 jako reverse proxy (patrz poprzednia odpowiedź).