2013-03-13 17 views
6

mongooseとgridfs-streamを使ってmongodbからファイルを読み込んでいます。私はここの例に従っています:https://github.com/aheckmann/gridfs-streamnode.js、mongoose、gridfs-streamを使ってファイルを読み込みます。

ファイルをdbに書き込むことはうまくいきましたが、ファイルの読み込みに問題がありました。

何のMongoDBルックス(ショーコレクション)

fs.chunks 
fs.files 

何のファイル・インデックス・ルックス(db.fs.files.find())

{ "_id" : ObjectId("5140392659851df70b000001"), 
"filename" : "cover", 
"contentType" : "binary/octet-stream", 
"length" : 85734, 
"chunkSize" : 262144, 
"uploadDate" : ISODate("2013-03-13T08:30:30.299Z"), 
"aliases" : null, 
"metadata" : null, 
"md5" : "4476b26067daa0677978ba501308a35d" } 

その後、私は、ファイルを取得するには、このコードを使用します名前の "カバー"

... 
var gfs = Grid(mongoose.connection.db, mongoose.mongo) 
var readstream = gfs.createReadStream('cover') 

エラーが発生しました:

Error: cover does not exist 
at self.collection.self.fileId (/mypath/node_modules/mongoose/node_modules/mongodb/lib/mongodb/gridfs/gridstore.js:198:26) 
at Cursor.nextObject (/mypath/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursor.js:654:35) 
at Cursor.close (/mypath/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursor.js:960:5) 
at Cursor.nextObject (/mypath/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursor.js:654:17) 
at Cursor.nextObject.commandHandler (/mypath/node_modules/mongoose/node_modules/mongodb/lib/mongodb/cursor.js:631:14) 
at Db._executeQueryCommand (/mypath/node_modules/mongoose/node_modules/mongodb/lib/mongodb/db.js:1702:5) 
at g (events.js:185:14) 
at EventEmitter.emit (events.js:115:20) 
at Server.Base._callHandler (/mypath/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/base.js:130:25) 
at Server.connect.connectionPool.on.server._serverState (/mypath/node_modules/mongoose/node_modules/mongodb/lib/mongodb/connection/server.js:517:20) 

私はそれをGoogleで検索し、いくつかの可能な関連リンクを見つけた:

https://github.com/mongodb/node-mongodb-native/issues/621

Why gridfs get isn't working on file id (ObjectId) only by filename

+1

私は "5140392659851df70b000001" と "ファイル名" を交換する場合、それは動作します: 'VAR readstream = gfs.createReadStream( '5140392659851df70b000001')'。理由は鍵を設定することに関連していると思いますか? – LKS

+0

また、ドライバストリームの実装を見てみることもできます。http://mongodb.github.com/node-mongodb-native/api-generated/gridstore.html#stream – christkv

+1

興味深いことに、ファイルへの参照をマングース作成の文書ですか?私はGridFSを使用してみて、人々がそれをどのように実装しているのだろうかと思っていました。 – Leonidas

答えて

11

GitHubの上の例のコードは、少し誤解を招くようでした。私はあなたがしたのと同じエラーメッセージを最初に受け取りました。私の場合は、書き込みストリームが終了する前にファイルを読み込もうとしていたためです。私は"close"のイベントハンドラ内で読みをすることによって、これを解決:

var fs = require("fs"), 
    mongo = require("mongodb"), 
    Grid = require("gridfs-stream"), 
    gridfs, 
    writeStream, 
    readStream, 
    buffer = ""; 

mongo.MongoClient.connect("mongodb://localhost/gridfs_test", function (err, db) { 
    "use strict"; 
    gridfs = Grid(db, mongo); 

    // write file 
    writeStream = gridfs.createWriteStream({ filename: "test.txt" }); 
    fs.createReadStream("test.txt").pipe(writeStream); 

    // after the write is finished 
    writeStream.on("close", function() { 
     // read file, buffering data as we go 
     readStream = gridfs.createReadStream({ filename: "test.txt" }); 

     readStream.on("data", function (chunk) { 
      buffer += chunk; 
     }); 

     // dump contents to console when complete 
     readStream.on("end", function() { 
      console.log("contents of file:\n\n", buffer); 
     }); 
    }); 
}); 
関連する問題