Pour utiliser MongoDB dans une application Koa, nous allons configurer une connexion à la base de données et créer une classe d'accès aux données. MongoDB Compass peut être utilisé comme outil de visualisation pour faciliter le développement.
Installation et configuration
Installez MongoDB localement ou via Docker, puis ajoutez le package npm mongodb à votre projet Koa :
npm install mongodb --save
Créez un fichier de configuration pour stocker les paramètres de connexion :
// config.js
const configuration = {
uriConnexion: 'mongodb://localhost:27017/',
nomBase: 'ma_base_koa'
};
module.exports = configuration;
Connexion à la base de données
Établissez une connexion avec MongoDB en utilisant l'URI et le nom de la base :
const { MongoClient } = require('mongodb');
const config = require('./config');
MongoClient.connect(config.uriConnexion, (erreur, client) => {
if (erreur) {
console.error('Échec de la connexion :', erreur);
return;
}
const baseDonnees = client.db(config.nomBase);
// Opérations sur la base ici
});
Opérations CRUD de base
Exemples d'insertion et de lecture de données :
// Insertion d'un document
baseDonnees.collection('utilisateurs').insertOne({
nom: 'Alice',
age: 30,
role: 'développeur'
}, (err, resultat) => {
if (!err) {
console.log('Document inséré avec succès');
client.close();
}
});
// Requête de lecture
const curseur = baseDonnees.collection('utilisateurs').find({});
curseur.toArray((err, documents) => {
console.log(documents);
});
Classe d'accès aux données encapsulée
Pour réutiliser la logique d'accès à la base, une classe singleton gère la connexion et les opérations :
// baseDeDonnees.js
const { MongoClient } = require('mongodb');
const config = require('./config');
class GestionnaireBDD {
constructor() {
this.client = null;
}
static obtenirInstance() {
if (!GestionnaireBDD.instance) {
GestionnaireBDD.instance = new GestionnaireBDD();
}
return GestionnaireBDD.instance;
}
connecter() {
return new Promise((resolve, reject) => {
if (this.client) {
resolve(this.client);
return;
}
MongoClient.connect(config.uriConnexion, (err, client) => {
if (err) reject(err);
else {
this.client = client.db(config.nomBase);
resolve(this.client);
}
});
});
}
rechercher(nomCollection, critere) {
return new Promise((resolve, reject) => {
this.connecter().then(db => {
db.collection(nomCollection).find(critere).toArray((err, docs) => {
err ? reject(err) : resolve(docs);
});
}).catch(reject);
});
}
inserer(nomCollection, document) {
return new Promise((resolve, reject) => {
this.connecter().then(db => {
db.collection(nomCollection).insertOne(document, (err, res) => {
err ? reject(err) : resolve(res);
});
}).catch(reject);
});
}
mettreAJour(nomCollection, filtre, modifications) {
return new Promise((resolve, reject) => {
this.connecter().then(db => {
db.collection(nomCollection).updateOne(filtre, { $set: modifications }, (err, res) => {
err ? reject(err) : resolve(res);
});
}).catch(reject);
});
}
supprimer(nomCollection, filtre) {
return new Promise((resolve, reject) => {
this.connecter().then(db => {
db.collection(nomCollection).deleteOne(filtre, (err, res) => {
err ? reject(err) : resolve(res);
});
}).catch(reject);
});
}
}
module.exports = GestionnaireBDD.obtenirInstance();