用node.js,mongoose,gridfs-stream读取文件

我正在使用mongoose和gridfs-stream来存储和读取mongodb中的文件。 我在这里的例子: https : //github.com/aheckmann/gridfs-stream

写入文件到数据库工作正常,但我面临读取文件的问题。

什么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

为什么gridfs只能通过文件名来处理文件id(ObjectId)

GitHub上的示例代码有点让人误解。 我最初收到了你所做的同样的错误信息。 就我而言,这是由于我正在尝试在写入stream完成之前读取文件。 我通过执行"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); }); }); });