Connecter une base de données à Node.js
Une application Node.js sans base de données reste rare : comptes, commandes, contenus. Sur l'hébergement d'applications, la base et ses accès dépendent de l'offre ; le code doit donc lire l'hôte, le port, le nom et les identifiants depuis les variables du panneau. Deux choix structurants : le pilote et la gestion du pool de connexions.
Choisir le pilote
| Base | Paquet recommandé | Remarque |
|---|---|---|
| MySQL / MariaDB | mysql2 |
Promesses natives, paquet mysql obsolète |
| PostgreSQL | pg |
Pool intégré |
| Les deux via ORM | Prisma, Sequelize, Knex | Plus d'abstraction, migrations incluses |
Un pilote suffit pour une petite API. Un ORM aide si vous avez plusieurs tables, des migrations et une équipe. Dans les deux cas, les requêtes doivent être paramétrées.
Configurer sans coder en dur
DATABASE_HOST=...
DATABASE_PORT=3306
DATABASE_NAME=...
DATABASE_USER=...
DATABASE_PASSWORD=...ou une seule URL :
DATABASE_URL=mysql://utilisateur:mot-de-passe@hote:3306/baseL'hôte est celui indiqué par le panneau, pas localhost par réflexe : la base peut être sur une autre machine que le processus. Ces valeurs ne vont jamais dans le dépôt Git. Validez leur présence au démarrage et affichez l'hôte et le nom de la base dans le journal, jamais le mot de passe.
Pool et requêtes
Créer une connexion par requête épuise les ressources et ajoute de la latence. Utilisez un pool unique, créé au démarrage.
const mysql = require('mysql2/promise');
const pool = mysql.createPool({
host: process.env.DATABASE_HOST,
port: Number(process.env.DATABASE_PORT || 3306),
user: process.env.DATABASE_USER,
password: process.env.DATABASE_PASSWORD,
database: process.env.DATABASE_NAME,
waitForConnections: true,
connectionLimit: 5,
queueLimit: 0
});
const [rows] = await pool.query('SELECT id, name FROM items WHERE id = ?', [id]);Avec PostgreSQL :
const { Pool } = require('pg');
const pool = new Pool({ connectionString: process.env.DATABASE_URL, max: 5 });
const { rows } = await pool.query('SELECT id, name FROM items WHERE id = $1', [id]);Adaptez connectionLimit ou max à l'offre : un pool de 20 sur une base qui en autorise 10 provoque des erreurs d'épuisement. En cas d'erreur Too many connections, réduisez le pool avant d'augmenter l'offre. Fermez le pool sur SIGTERM avec await pool.end().
Migrations et sauvegardes
Une migration doit être versionnée, idempotente et exécutée une seule fois. Ne la lancez pas automatiquement à chaque démarrage si plusieurs instances peuvent démarrer en parallèle. Sauvegardez la base avant une migration destructive, puis testez la restauration.
L'utilisateur applicatif n'a pas besoin de DROP ni de droits d'administration. Accordez uniquement SELECT, INSERT, UPDATE, DELETE sur la base concernée. Les exports SQL ne doivent pas se retrouver dans un dossier public.
Vérifier
Exécutez SELECT 1, puis une requête réelle sur une table. Vérifiez que le journal indique la bonne base, que les erreurs de connexion sont explicites et que le pool se ferme au redémarrage. Si l'application démarre mais que la première requête échoue, le problème est souvent l'hôte ou les droits, pas le pilote.
Publicité
Cet article vous a-t-il aidé ?
À lire aussi
- Déployer une API ExpressStructurer une API Express, valider les entrées et exposer une route de santé.
- Gérer les dépendances Node.jsVerrouiller les versions, utiliser npm ci et mettre à jour les paquets sans casser le déploiement.
- Héberger un bot Discord Node.jsConnecter un bot discord.js avec un jeton en variable, des intents minimaux et des caches bornés.