相同的图像出现在渲染但不在源中与gridfs-stream(mongoose& mongo驱动程序)

时间:2013-11-28 18:54:44

标签: node.js mongodb express gridfs gridfs-stream

我遇到一个奇怪的问题,其中图像在索引上不止一次显示,但在固定链接视图中显示每个帖子的正确系列图像。

我正在使用此控制器,路由到/grid/:id

exports.getById = function(req, res){
  id = req.params.id;
  var conn = mongoose.createConnection(res.locals.db);
  conn.once('open', function(){
    var gfs = Grid(conn.db, mongoose.mongo);
    gfs.files.find({ _id: ObjectID(id) }).toArray(function(err, files){
      if (err) throw new Error(err);
      // console.log(files);
      res.set('Content-Type', files[0].contentType);
    });
    var readstream = gfs.createReadStream({ _id: id });
    readstream.pipe(res);
  });
};

屏幕截图是我解释正在发生的事情的最简单方法。

这是当前正在呈现的索引(注意这里有两个不同的链接,但显示的是相同的图像)Index page

以下是对Web Inspector中第一张图片的检查: enter image description here

仔细检查...... enter image description here

但是,如果我转到该帖子的永久链接页面,它会随机显示正确的图像或同一图像。但是,如果我将第一张图像拖到地址栏然后再回击,它会再次显示正确的图像: enter image description here

直到我点击刷新... enter image description here

我的第一个猜测是发送了错误的ContentType,但现在代码发送了res.set('ContentType', files[0].contentType);这可行,但即使手动将其设置为'image/png'也无法解决问题。

我还使用标准mongodb驱动程序制作了第二个控制器,但我得到了同样的错误。

var mongo = require('mongodb');
var Grid = require('gridfs-stream');
var ObjectID = require('mongodb').ObjectID;

exports.mongoGet = function(req, res){
  id = req.params.id;
  var db = new mongo.Db('database', new mongo.Server("127.0.0.1", 27017), {safe: true});
  db.open(function (err){
    if (err) throw new Error(err);
    var gfs = Grid(db, mongo);
    var readstream = gfs.createReadStream({ _id: ObjectID(id) });
    res.set('Content-Type', 'image/png');
    readstream.pipe(res);  
  });
};

这让我经历了一个巨大的循环。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:1)

您的id变量是全局变量,并且会被每个新请求覆盖,从而破坏之前的值。

所以:

exports.mongoGet = function(req, res) {
  var id = req.params.id;
  ^^^
  ...
};

添加了提示:您不必为每个请求创建新的Mongoose连接,这不是非常有效。只需在应用程序启动时的某个地方执行此操作;默认情况下,如果断开连接,Mongoose将自动重新连接到MongoDB。