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