Voila bientôt la fin ! Il ne nous reste plus qu’a sauver les images dans la base de données et de faire les routes sur express pour récupérer les images, et les images en fonction du tag associées a celles-ci.

Partie 4 : MongodDb

Pour faciliter nos requêtes a la base de données, nous allons utiliser un ODM (Object Document Mapper) , alors, oui,  le terme fais un peux peur mais en fait c’est fait pour nous faciliter la vie, c’est ODM c’est Mongoose.

on va créer un dossier db pour séparer du reste du code et dans db créer un dossier modele, qui symbolise le format des objects existant dans la base de données:

$ mkdir -p db/models

On installe Mongoose:

$ npm install --save mongoose

On crée d’abord le modèle:


//content of db/models/image.js
const mongoose = require('mongoose');

// build the schema
const imageSchema = mongoose.Schema({
path: String,
tags: [String]
});

// compile the schema into a model
const Image = mongoose.model('Image', imageSchema);

module.exports = Image

Ensuite la connection a la database:


//content of db/index.js
const mongoose = require('mongoose');
const Image = require('./models/image');

// connect the database
mongoose.connect('mongodb://localhost/images');

module.exports = Image

Et finalement incorporer, la persistence des données dans le api/app.js ainsi que les routes qui nous permettront de récupérer les données:


//content of api/app.js
const express = require('express')
const multer = require('multer')
const clarifay = require('./clarifay')
const fs = require('fs');
const Image = require('../db')

const storage = multer.diskStorage({
destination: function (req, file, cb) {
cb(null, './uploads')
},
filename: (req, file, cb) => {
cb(null, `${Date.now()}.${file.mimetype.split('/')[1]}`)
}
})

const upload = multer({ storage })
const app = express()

app.post('/photos/upload', upload.array('photos'), (req, res, next) => {
const message = { "data": [] }
req.files.forEach(image => {
fs.readFile(image.path, function (err, data) {
// predict the contents of an image by passing in base 64 encoded file
clarifay
.analyse(new Buffer(data).toString('base64'))
.then(
response => {
const imageObject = {
'path': image.path,
'tags': serialize(response.outputs[0].data.concepts)
}
message.data.push(imageObject)
// save in db
const imageData = new Image(imageObject)
imageData.save()
// if every image has been proccessed send back the response
if (message.data.length == req.files.length) {
res.status(200).send(message)
}
},
err => console.error(err)
);
});
})
})

// get all images
app.get('/photos', (req, res, next) => {
Image.find({}, (err, images) => res.send(images))
})

// get images by tags
app.get('/photos/:tag', (req, res, next) => {
Image.find({ tags: req.params.tag }, (err, images) => res.send(images))
})

// get the tags from the Clarifay API
const serialize = (array) => {
let subjects = [];
array.forEach(function (element) {
subjects.push(element.name)
});
// get only the best of 3 results
return subjects.slice(0, 3)
}

module.exports = app

Voila c’est fini, pour cette série !! Vous trouverez le code complet ici