0

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

我正在使用这个控制器,路由到/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);
  });
};

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

这是当前正在渲染的索引(请注意,这里有两个不同的链接,但显示的是相同的图像)索引页面

这是对 Web Inspector 中第一张图像的检查: 在此处输入图像描述

经过仔细检查…… 在此处输入图像描述

但是,如果我转到该帖子的永久链接页面,它会随机显示正确的图像或再次显示相同的图像。但是,如果我将第一张图片拖到地址栏然后回击,它会再次显示正确的图片: 在此处输入图像描述

直到我点击刷新... 在此处输入图像描述

我的第一个猜测是它发送了不正确的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);  
  });
};

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

4

1 回答 1

1

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

所以:

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

添加提示:您不必为每个请求创建一个新的 Mongoose 连接,这不是很有效。只需在您的应用程序开始时的某个地方执行一次;默认情况下,Mongoose 会在断开连接时自动重新连接到 MongoDB。

于 2013-11-28T18:59:32.793 回答