MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Renderizar imagem armazenada no Mongo (GridFS) com Node + Jade + Express


Eu descobri isso (obrigado Timothy!). O problema era minha compreensão de todas essas tecnologias e como elas se encaixavam. Para qualquer pessoa interessada em exibir imagens do MongoDB GridFS usando Node, Express e Jade ...

Meu documento no MongoDB tem uma referência à imagem armazenada no GridFS que é um ObjectId armazenado como uma string. por exemplo. MyEntity {ImageId:'4f6d39ab519b481eb4a5cf52'} <-- NB:Representação de string de ObjectId. A razão pela qual eu armazenei como uma string foi porque armazenar o ObjectId estava me dando uma dor no roteamento, pois estava renderizando como binário e eu não conseguia descobrir como consertar isso. (Talvez alguém possa ajudar aqui?). De qualquer forma, a solução que tenho está abaixo:

Repositório de Arquivos - Recupere a imagem do GridFS, passo um String Id, que depois converto para um BSON ObjectId (você também pode obter o arquivo pelo nome do arquivo):
FileRepository.prototype.getFile = function(callback,id) {
   var gs = new GridStore(this.db,new ObjectID(id), 'r');
   gs.open(function(err,gs){
      gs.read(callback);
   });
 };

Modelo Jade - Renderize a marcação HTML:
img(src='/data/#{myentity.ImageId}')

Arquivo App.JS - Roteamento (usando Express) configuro a rota '/data/:imgtag' para imagens 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 );
});

E isso fez o trabalho. Qualquer dúvida me avise :)