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);
  });
};

スクリーンショットは、何が起こっているのかを説明する最も簡単な方法です。

現在レンダリング中のインデックスは次のとおり です (ここには 2 つの異なるリンクがありますが、同じ画像が表示されていることに注意してください) 。目次ページ

Web Inspector の最初の画像の検査は次のとおりです。 ここに画像の説明を入力

詳しく調べると… ここに画像の説明を入力

ただし、その投稿のパーマリンク ページに移動すると、ランダムに正しい画像が表示されるか、同じ画像が再度表示されます。ただし、最初の画像をアドレスバーにドラッグしてから戻すと、正しい画像が再び表示されます。 ここに画像の説明を入力

リフレッシュするまで… ここに画像の説明を入力

私の最初の推測では、間違った を送信していたContentTypeのですが、コードはそれをres.set('ContentType', files[0].contentType);で送信します。これは機能しますが、手動で設定して'image/png'も修正されません。

標準ドライバーを使用するための2番目のコントローラーも作成しました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 に答える