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ź).