Read file with node.js, mongoose, gridfs-stream

20,060

The example code on GitHub was a little bit misleading; I initially received the same error message you did. In my case, it was due to the fact that I was attempting to read the file before the write stream had finished. I resolved this by doing the read inside the event handler for "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);
        });
    });
});
Share:
20,060
LKS
Author by

LKS

Updated on July 09, 2022

Comments

  • LKS
    LKS almost 2 years

    I am using mongoose and gridfs-stream to store and read files from mongodb. I am following the example here: https://github.com/aheckmann/gridfs-stream

    Writing files into db is working fine but I faced a problem to read files.

    What the mongodb looks (show collections)

    fs.chunks
    fs.files
    

    What the file index looks (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" }
    

    Then I use this code to get file named "cover"

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

    An error occured:

    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)
    

    I googled it and found some possible related links:

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

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