NeDB (Node embedded database)

J’ai souvent besoin de prototyper rapidement des webapps avec un backend (node) pour persister des données et je n’ai pas envie à chaque fois d’utiliser une “vraie” base de données, ne serait-ce que pour pouvoir fournir simplement ma démo à un tiers sans qu’il soit obligé d’installer toute une “tripotée” de chose. J’ai découvert une base de données “fichier” qui fonctionne avec une logique NoSQL, très pratique et très complète avec un petit air de MongoDB. Cette base “embarquée” s’appelle NeDB, vous pouvez trouver son repository ici : https://github.com/louischatriot/nedb.

Voyons donc rapidement comment s’en servir au sein d’une application Express.

Création du squelette d’application

Créez un répertoire books avec 3 fichiers à l’intérieur :

  • package.json : qui contiendra la liste des dépendances “back” pour faire tourner notre application Express
  • .bowerrc : où l’on explique à Bower où télécharger les librairies javascript “front”
  • bower.json : où l’on explique quelles sont les librairies javascript “front” dont nous avons besoin

Contenu de package.json :

{
  "name": "books",
  "description" : "books",
  "version": "0.0.0",
  "dependencies": {
    "express": "4.1.x",
    "body-parser": "1.0.2",
    "nedb": "0.10.5"
  }
}

Contenu de .bowerrc :

{
  "directory": "public/js/bower_components"
}

Contenu de bower.json :

{
  "name": "books",
  "version": "0.0.0",
  "dependencies": {
    "jquery" : null
  }
}

Ensuite dans un terminal, tapez npm install, puis bower install

Partie “cliente” de notre démo

Vous avez maintenant un répertoire public qui contient aussi jQuery. Notre page de démo consistera en uniquement une page index.html qui référencera jQuery pour nous permettre de faire des requêtes ajax à notre application dans la console du navigateur. Donc dans public, créez une page index.html :

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
</head>
<body>
  <script src="js/bower_components/jquery/dist/jquery.min.js"></script>
</body>
</html>

Passons maintenant à la partie serveur.

Création de l’API “Books”

Nous voulons pouvoir ajouter des livres en base de données, pour pouvoir ensuite tous les lister ou les rechercher par titre ou par identifiant.

Pour cela, dans le répertoire books créez un fichier main.js :

Déclaration des variables

var express = require('express')
  , http = require('http')
  , bodyParser = require('body-parser')
  , DataStore = require('nedb')
  , app = express()
  , http_port = 3000
  , booksDb = new DataStore({ filename: 'booksDb.nedb' });
  • Où l’on fait référence à NeDB : DataStore = require('nedb')
  • Où l’on initialise le “datastore” dans un fichier : booksDb = new DataStore({ filename: 'booksDb.nedb' });

Initialisation de l’application

app.use(express.static(__dirname + '/public'));
app.use(bodyParser());

Créer un livre

app.post("/books", function(req, res) {

  var book = req.body;
  
  booksDb.insert(book, function (err, newDoc) {
    res.statusCode = 301;
    res.header("location", "/books/"+newDoc._id).end();
  });

});

Lister tous les livres

app.get("/books", function(req, res) {
  booksDb.find({}, function (err, docs) {
    res.send(docs);
  });

});

Retrouver un livre par son identifiant

app.get("/books/:id", function(req, res) {
  booksDb.findOne({ _id: req.params.id }, function (err, doc) {
    res.send(doc)
  });

});

Retrouver un livre par une chaîne contenue dans son titre

app.get("/books/search/title/:value", function(req, res) {
  var r = new RegExp(req.params.value, "i");
  booksDb.find({ "title": { $regex: r } }, function (err, docs) {
    res.send(docs);
  });

});

Démarrer l’application

booksDb.loadDatabase(function (err) {
  app.listen(http_port);
  console.log("Listening on " + http_port);
});

L’application express est lancée une fois la base de données “ouverte”.

Utilisation de notre application

Commencez par lancer l’application : node main.js, puis connectez vous à http://localhost:3000 et ouvrez la console de votre navigateur :

Création de livres

Dans la console, lancez ceci :

$.ajax({
  type: "POST",
  url: "/books",
  dataType: "json",
  data:{ title:"Backbone ça déchire", author:"@k33g_org"}
});

$.ajax({
 type: "POST",
 url: "/books",
 dataType: "json",
 data:{ title:"React ça dépote", author:"@k33g_org"}
});

$.ajax({
 type: "POST",
 url: "/books",
 dataType: "json",
 data:{ title:"J'apprends Angular", author:"@k33g_org"}
});

Alt "nedb01.png"

Nous venons juste de créer 3 livres. Vérifions …

Obtenir la liste des livres

Dans la console, lancez ceci :

$.getJSON("books", function(data) { console.log(data); })

Nous obtenons biens nos 3 livres :

Alt "nedb02.png"

Obtenir un livre par son id

Dans la console, lancez ceci :

$.getJSON("books/iUq5g0JdPXYVcvcn", function(data) { console.log(data); })

(vérifiez que vous utilisez un id existant, les ids sont générés automatiquement par NeDB à la création d’un document).

Alt "nedb03.png"

Chercher un livre par son titre

Imaginons que je souhaite récupérer les livres dont le titre contient “bone”, dans la console, lancez ceci :

$.getJSON("books/search/title/bone", function(data) { console.log(data); })

Et l’on obtient un tableau avec un enregistrement :

Alt "nedb04.png"

Donc vous pouvez le constater, la mise en œuvre et l’utilisation de NeDB est extrêmement simple (et pratique).

Bon dimanche :)

blog comments powered by Disqus

Related posts