我遇到一个奇怪的问题,其中图像在索引上不止一次显示,但在固定链接视图中显示每个帖子的正确系列图像。
我正在使用此控制器,路由到/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);
});
};
这让我经历了一个巨大的循环。任何帮助将不胜感激!
答案 0 :(得分:1)
您的id
变量是全局变量,并且会被每个新请求覆盖,从而破坏之前的值。
所以:
exports.mongoGet = function(req, res) {
var id = req.params.id;
^^^
...
};
添加了提示:您不必为每个请求创建新的Mongoose连接,这不是非常有效。只需在应用程序启动时的某个地方执行此操作;默认情况下,如果断开连接,Mongoose将自动重新连接到MongoDB。