sql >> Base de Datos >  >> NoSQL >> MongoDB

Renderizar imagen almacenada en Mongo (GridFS) con Node + Jade + Express

Me di cuenta de esto (¡gracias Timothy!). El problema era mi comprensión de todas estas tecnologías y cómo encajaban entre sí. Para cualquier otra persona que esté interesada en mostrar imágenes de MongoDB GridFS usando Node, Express y Jade...

Mi documento en MongoDB tiene una referencia a la imagen almacenada en GridFS, que es un ObjectId almacenado como una cadena. p.ej. MyEntity {ImageId:'4f6d39ab519b481eb4a5cf52'} <-- NB:representación de cadena de ObjectId. La razón por la que lo almacené como una cadena fue porque almacenar el ObjectId me estaba causando problemas en el enrutamiento, ya que se estaba representando como binario y no pude encontrar la manera de solucionarlo. (¿Quizás alguien pueda ayudar aquí?). De todos modos, la solución que tengo es la siguiente:

Repositorio de archivos - Recupere la imagen de GridFS, le paso un Id. de cadena, que luego convierto en un Id. de objeto BSON (también puede obtener el archivo por nombre de archivo):

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

Plantilla de jade - Representar el marcado HTML:

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

Archivo App.JS - Enrutamiento (usando Express) Configuré la ruta '/data/:imgtag' para imágenes dinámicas:

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

Y eso hizo el trabajo. Cualquier duda me avisas :)