我弄清楚了这个问题(感谢Timothy!)。问题在于我对所有这些技术以及它们如何相互配合的理解。对于任何其他想要使用Node、Express和Jade来显示来自MongoDB GridFS的图像的人...
我的MongoDB文档引用了存储在GridFS中的图像,其是作为字符串存储的ObjectId。例如,MyEntity {ImageId:'4f6d39ab519b481eb4a5cf52'} <-- 注意:ObjectId的字符串表示形式。我将其存储为字符串的原因是,将ObjectId存储时会在路由中产生疼痛,因为它呈二进制渲染,并且我无法弄清楚如何解决此问题(也许有人可以在这里帮忙?)。无论如何,我拥有的解决方案如下:
FileRepository - 从GridFS检索图像,我传递一个字符串Id,然后将其转换为BSON ObjectId(您还可以通过文件名获取文件):
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模板 - 渲染HTML标记:
img(src='/data/#{myentity.ImageId}')
App.JS文件 - 路由(使用Express)我设置了'/data/:imgtag'路由以获取动态图片:
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 );
});
这样做就可以了。如果有任何问题,请告诉我 :)