Next.js : Intégration d’un projet Express Sequelize PostgreSQL.

Pour intégrer votre application Node.js avec Express et Sequelize dans une application Next.js, vous pouvez conserver votre architecture backend tout en structurant votre projet pour combiner l’API existante avec les fonctionnalités frontend de Next.js. Voici une proposition de structure et un guide pour l’intégration.


Structure proposée

/my-nextjs-app
├── /app                   # Répertoire pour les pages et les API de Next.js
│   ├── /api               # API internes spécifiques à Next.js (complémentaires à Express)
│   │   └── route.js       # Exemple d'API Next.js
│   ├── /dashboard
│   │   ├── layout.js      # Layout partagé
│   │   └── page.js        # Page principale pour `/dashboard`
│   └── layout.js          # Layout global
│   └── page.js            # Page d'accueil `/`
├── /backend               # Répertoire contenant l'application Node.js Express/Sequelize existante
│   ├── /config            # Configuration de Sequelize et autres fichiers
│   ├── /models            # Modèles Sequelize
│   ├── /routes            # Routes Express
│   ├── /services          # Logique métier
│   ├── app.js             # Configuration Express
│   └── server.js          # Point d'entrée du serveur Express
├── /components            # Composants React réutilisables
├── /lib                   # Bibliothèques partagées
│   ├── api.js             # Client pour communiquer avec l'API Express
│   └── db.js              # Connexion Sequelize si utilisée dans Next.js
├── /public                # Fichiers publics (images, favicon, etc.)
├── /styles                # Fichiers CSS globaux
├── .env                   # Variables d'environnement
├── next.config.js         # Configuration Next.js
├── package.json           # Dépendances
└── README.md              # Documentation


Étapes pour l’intégration

1. Conserver l’application Express dans /backend

  • Copiez les répertoires models, config, services, et routes existants dans le répertoire /backend.
  • Créez un fichier server.js dans /backend pour lancer votre application Express indépendamment :
// backend/server.js
const express = require('express');
const app = require('./app');

const PORT = process.env.BACKEND_PORT || 4000;

app.listen(PORT, () => {
  console.log(`Express backend running on http://localhost:${PORT}`);
});


2. Utiliser l’application Express avec Next.js

Vous pouvez configurer Next.js pour exécuter votre serveur Express via un serveur personnalisé.

Exemple d’un serveur Next.js avec Express :
// server.js (point d'entrée principal)
const express = require('express');
const next = require('next');
const backendApp = require('./backend/app'); // Importez votre app Express

const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev });
const handle = app.getRequestHandler();

const PORT = process.env.PORT || 3000;

app.prepare().then(() => {
  const server = express();

  // Routes backend via Express
  server.use('/api', backendApp); // Utilise l'API Express sous `/api`

  // Routes Next.js
  server.all('*', (req, res) => {
    return handle(req, res);
  });

  server.listen(PORT, () => {
    console.log(`Next.js + Express running on http://localhost:${PORT}`);
  });
});


3. Communiquer avec l’API Express depuis Next.js

Utilisez le répertoire /lib pour centraliser les appels vers votre API Express.

Exemple d’un client API :
// lib/api.js
const API_URL = process.env.BACKEND_URL || 'http://localhost:4000';

export async function fetchUsers() {
  const response = await fetch(`${API_URL}/users`);
  if (!response.ok) throw new Error('Failed to fetch users');
  return response.json();
}

Dans une page Next.js, vous pouvez alors consommer cette API :

// app/users/page.js
import { fetchUsers } from '@/lib/api';

export default async function UsersPage() {
  const users = await fetchUsers();

  return (
    <div>
      <h1>Liste des utilisateurs</h1>
      <ul>
        {users.map(user => (
          <li key={user.id}>{user.name}</li>
        ))}
      </ul>
    </div>
  );
}


4. Base de données avec Sequelize

Si vous souhaitez utiliser Sequelize directement dans Next.js pour certaines fonctionnalités (par exemple, dans des API routes spécifiques), configurez une instance dans /lib/db.js.

Exemple de configuration Sequelize :
// lib/db.js
const { Sequelize } = require('sequelize');
const sequelize = new Sequelize(process.env.DB_URL, { dialect: 'postgres' });

module.exports = sequelize;

Dans une API Next.js :

// app/api/products/route.js
import db from '@/lib/db';

export async function GET() {
  const products = await db.models.Product.findAll();
  return new Response(JSON.stringify(products), { status: 200 });
}


5. Graduellement migrer les routes Express vers Next.js (optionnel)

Si vous souhaitez réduire la dépendance à Express, migrez vos routes Express en API Routes Next.js dans /app/api.

Exemple de migration :

Route Express existante :

// backend/routes/users.js
const express = require('express');
const router = express.Router();
router.get('/', async (req, res) => {
  const users = await User.findAll();
  res.json(users);
});
module.exports = router;

Migrée vers Next.js :

// app/api/users/route.js
import db from '@/lib/db';

export async function GET() {
  const users = await db.models.User.findAll();
  return new Response(JSON.stringify(users), { status: 200 });
}


Avantages de cette structure

  1. Modularité : Conservez votre application backend séparée dans /backend.
  2. Progressivité : Vous pouvez choisir de conserver Express ou de migrer progressivement vos routes vers Next.js.
  3. Réutilisabilité : Centralisez la logique métier dans /backend/services et partagez-la entre Express et Next.js.

Excellente question ! Voici une clarification complète pour répondre à vos doutes et simplifier la structure proposée.


Plusieurs questions

J’ai 2 fichiers server.js ou sont il ?

Dans un projet express sequelize, j’ai un fichier index.js qui contient la logique de connexion vers la base de données, qui utilise un fichier de properties dans le répertoire config.

Pourquoi je créer un fichier lib/db.js ?

1. Les deux fichiers server.js mentionnés

a) server.js pour Express (dans /backend)

  • Ce fichier sert uniquement à exécuter votre application Express séparée, indépendante de Next.js.
  • C’est là où vous configurez votre application Express + Sequelize pour qu’elle fonctionne en dehors de Next.js.
  • Par exemple : /backend ├── server.js <- Lance uniquement l'application Express. ├── app.js ├── config/ ├── models/ ├── routes/

b) server.js pour Next.js personnalisé (dans la racine /)

  • Ce fichier est un serveur personnalisé utilisé pour combiner votre application Next.js et Express.
  • Il agit comme un point d’entrée principal qui redirige :
    • Les requêtes frontend vers Next.js.
    • Les requêtes backend vers votre Express via /api.

Structure proposée :

/my-nextjs-app
├── server.js       <- Lance l'application Next.js et inclut votre Express.
├── /backend/
│   ├── server.js   <- Exclusivement pour votre backend standalone.

Pourquoi deux fichiers ?

  • Si vous voulez séparer complètement Express et Next.js pour les exécuter indépendamment, conservez les deux.
  • Si vous voulez tout intégrer dans Next.js, vous pourriez n’utiliser qu’un seul server.js (celui à la racine). On peut adapter cela selon votre besoin.

2. Fichier lib/db.js vs config/index.js

Actuellement dans votre projet Express :

  • Vous avez un fichier (par exemple config/index.js) qui contient :
    • La connexion Sequelize.
    • Les paramètres de configuration pour la base de données (via un fichier config.json ou .env).

Exemple :

// backend/config/index.js
const { Sequelize } = require('sequelize');
const config = require('./properties'); // Exemple d'importation

const sequelize = new Sequelize(
  config.database,
  config.username,
  config.password,
  { host: config.host, dialect: config.dialect }
);

module.exports = sequelize;

Dans Next.js avec lib/db.js :

  • Le fichier lib/db.js sert de pont entre Sequelize et les API routes spécifiques à Next.js.
  • Pourquoi ?
    • Pour rendre la connexion accessible directement aux API routes de Next.js (sans répéter la configuration Sequelize dans chaque route).
    • Permet de centraliser les dépendances côté Next.js.

Exemple simplifié :

// lib/db.js
import sequelize from '../backend/config/index'; // Réutilise votre logique existante

export default sequelize;

Alternatives :

  • Si vous ne voulez pas créer un nouveau fichier lib/db.js, vous pouvez directement utiliser votre fichier config/index.js dans Next.js. Exemple : // app/api/users/route.js import db from '../../backend/config/index'; export async function GET() { const users = await db.models.User.findAll(); return new Response(JSON.stringify(users), { status: 200 }); }

3. Doit-on vraiment séparer la base de données entre Express et Next.js ?

Non, vous pouvez centraliser tout dans votre backend actuel.

Si vous voulez garder Express comme principal backend :

  • Toutes les opérations de base de données restent dans Express.
  • Next.js se contente d’appeler votre API via /api.

Si vous voulez migrer certaines fonctionnalités vers Next.js :

  • Créez un fichier partagé (lib/db.js ou backend/config/index.js) pour une connexion réutilisable dans les API Routes de Next.js.

Recommandations pour simplifier :

Option A : Centralisez tout dans /backend

  • Continuez à gérer Sequelize uniquement dans Express (dans /backend/config).
  • Faites en sorte que Next.js consomme cette API via fetch : // lib/api.js const API_URL = 'http://localhost:4000'; // Point d'entrée Express export async function fetchUsers() { const response = await fetch(`${API_URL}/users`); return await response.json(); }

Option B : Intégrez Sequelize directement dans Next.js

  • Déplacez la configuration Sequelize dans /lib/db.js et migrez certaines routes Express vers des API Next.js.
  • Exemple : // lib/db.js import { Sequelize } from 'sequelize'; const sequelize = new Sequelize(process.env.DB_URL, { dialect: 'postgres' }); export default sequelize; Ensuite, dans une API route Next.js : // app/api/users/route.js import db from '@/lib/db'; export async function GET() { const users = await db.models.User.findAll(); return new Response(JSON.stringify(users), { status: 200 }); }

Conclusion

  1. Si vous souhaitez conserver votre backend Express tel quel, inutile de créer un fichier lib/db.js. Reutilisez backend/config/index.js.
  2. Si vous voulez migrer progressivement vers un système sans Express, utilisez un fichier centralisé comme lib/db.js pour gérer les connexions dans Next.js.

Quelle option correspond mieux à vos besoins ? Souhaitez-vous un exemple détaillé d’intégration ?

Avatar de Inconnu

About Duarte TERENCIO

Architecte Solutions
Cet article a été publié dans Cloud computing. Ajoutez ce permalien à vos favoris.

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur la façon dont les données de vos commentaires sont traitées.