MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Rendre l'image stockée dans Mongo (GridFS) avec Node + Jade + Express

J'ai compris (merci Timothy !). Le problème était ma compréhension de toutes ces technologies et de la façon dont elles s'imbriquent. Pour tous ceux qui souhaitent afficher des images de MongoDB GridFS en utilisant Node, Express et Jade ...

Mon document dans MongoDB a une référence à l'image stockée dans GridFS qui est un ObjectId stocké sous forme de chaîne. par exemple. MyEntity {ImageId:'4f6d39ab519b481eb4a5cf52'} <-- NB :Représentation sous forme de chaîne d'ObjectId. La raison pour laquelle je l'ai stocké sous forme de chaîne était que le stockage de l'ObjectId me faisait mal dans le routage car il était rendu en binaire et je ne pouvais pas comprendre comment résoudre ce problème. (Peut-être que quelqu'un peut aider ici?). Quoi qu'il en soit, la solution que j'ai est ci-dessous :

Référentiel de fichiers - Récupérer l'image depuis GridFS, je passe un String Id, que je convertis ensuite en un BSON ObjectId (vous pouvez aussi récupérer le fichier par nom de fichier) :

FileRepository.prototype.getFile = function(callback,id) {
   var gs = new GridStore(this.db,new ObjectID(id), 'r');
   gs.open(function(err,gs){
      gs.read(callback);
   });
 };

Modèle Jade - Afficher le balisage HTML :

img(src='/data/#{myentity.ImageId}')

Fichier App.JS - Routage (avec Express) J'ai paramétré la route '/data/:imgtag' pour les images dynamiques :

app.get('/data/:imgtag', function(req, res) {
  fileRepository.getFile( function(error,data) {
     res.writeHead('200', {'Content-Type': 'image/png'});
     res.end(data,'binary');
  }, req.params.imgtag );
});

Et cela a fait l'affaire. Si vous avez des questions, faites-le moi savoir :)