MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Rendern Sie das in Mongo (GridFS) gespeicherte Bild mit Node + Jade + Express

Ich habe das herausgefunden (danke Timothy!). Das Problem war mein Verständnis all dieser Technologien und wie sie zusammenpassen. Für alle anderen, die daran interessiert sind, Bilder von MongoDB GridFS mit Node, Express und Jade anzuzeigen ...

Mein Dokument in MongoDB hat einen Verweis auf das in GridFS gespeicherte Bild, bei dem es sich um eine als Zeichenfolge gespeicherte ObjectId handelt. z.B. MyEntity {ImageId:'4f6d39ab519b481eb4a5cf52'} <-- NB:Zeichenfolgendarstellung von ObjectId. Der Grund, warum ich es als String gespeichert habe, war, dass das Speichern der ObjectId mir im Routing Probleme bereitete, da es als Binär gerendert wurde und ich nicht herausfinden konnte, wie ich das beheben könnte. (Vielleicht kann hier jemand helfen?). Wie auch immer, die Lösung, die ich habe, ist unten:

Datei-Repository - Rufen Sie das Bild von GridFS ab, ich übergebe eine String-ID, die ich dann in eine BSON-ObjectId umwandele (Sie können die Datei auch anhand des Dateinamens abrufen):

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

Jade-Vorlage - Rendern Sie das HTML-Markup:

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

App.JS-Datei - Routing (mit Express) Ich richte die Route '/data/:imgtag' für dynamische Bilder ein:

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 );
});

Und das hat funktioniert. Bei Fragen lass es mich wissen :)