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

LKS*_*LKS 6 mongoose mongodb node.js gridfs

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

将文件写入数据库工作正常,但我遇到了读取文件的问题.

mongodb看起来是什么(显示收藏)

fs.chunks
fs.files
Run Code Online (Sandbox Code Playgroud)

文件索引的外观(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" }
Run Code Online (Sandbox Code Playgroud)

然后我使用此代码获取名为"cover"的文件

...
var gfs = Grid(mongoose.connection.db, mongoose.mongo)
var readstream = gfs.createReadStream('cover')
Run Code Online (Sandbox Code Playgroud)

发生错误:

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)
Run Code Online (Sandbox Code Playgroud)

我用Google搜索并发现了一些可能的相关链接:

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

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

Rob*_*ell 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);
        });
    });
});
Run Code Online (Sandbox Code Playgroud)