sql >> Databasteknik >  >> NoSQL >> MongoDB

Rendera bild lagrad i Mongo (GridFS) med Node + Jade + Express

Jag kom på det här (tack Timothy!). Problemet var min förståelse av alla dessa tekniker och hur de passar ihop. För alla andra som är intresserade av att visa bilder från MongoDB GridFS med Node, Express och Jade ...

Mitt dokument i MongoDB har en referens till bilden lagrad i GridFS som är en ObjectId lagrad som en sträng. t.ex. MyEntity {ImageId:'4f6d39ab519b481eb4a5cf52'} <-- OBS:Strängrepresentation av ObjectId. Anledningen till att jag lagrade den som en sträng var att lagring av ObjectId gav mig en smärta i routing eftersom den renderades som binär och jag kunde inte lista ut hur jag skulle fixa detta. (Kanske någon kan hjälpa till här?). Hur som helst, lösningen jag har är nedan:

FileRepository - Hämta bilden från GridFS, jag skickar in ett String Id, som jag sedan konverterar till ett BSON ObjectId (du kan också få filen efter filnamn):

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-mall - Gör HTML-uppmärkningen:

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

App.JS-fil - Routing (med Express) Jag ställer in '/data/:imgtag'-rutten för dynamiska bilder:

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

Och det gjorde jobbet. Alla frågor låt mig veta :)



  1. Varför väntar detta utanför async-funktionen?

  2. MongoDB, uppdatera samlingsfältet om det nya värdet inte är null

  3. Node js mongoose befolka gräns

  4. MongoDB-konfiguration för Spring Boot - "url" med och utan autentiseringsuppgifter