2013-03-13 34 views
6

Tôi đang sử dụng mongoose và gridfs-stream để lưu trữ và đọc tệp từ mongodb. Tôi đang làm theo ví dụ ở đây: https://github.com/aheckmann/gridfs-streamĐọc tệp với node.js, mongoose, gridfs-stream

Viết tệp vào db hoạt động tốt nhưng tôi gặp sự cố khi đọc tệp.

Cái vẻ MongoDB (hiển thị các bộ sưu tập)

fs.chunks 
fs.files 

gì ngoại hình chỉ số tập tin (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" } 

Sau đó, tôi sử dụng mã này để có được file có tên là "cover"

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

Một lỗi xảy ra:

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) 

Tôi googled nó và tìm thấy một số liên kết có liên quan có thể:

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

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

+1

nếu tôi thay thế "filename" với "5140392659851df70b000001", nó hoạt động: 'var readstream = gfs.createReadStream ('5140392659851df70b000001')'. Tôi đoán lý do có liên quan đến việc thiết lập khóa? – LKS

+0

Bạn cũng có thể xem xét việc triển khai luồng trình điều khiển http://mongodb.github.com/node-mongodb-native/api-generated/gridstore.html#stream – christkv

+1

Rất tò mò, bạn có đang lưu trữ tham chiếu đến tệp trong đó không một mongoose tạo ra tài liệu? Tôi đang xem xét sử dụng GridFS và đã tự hỏi làm thế nào folks thực hiện nó. – Leonidas

Trả lời

11

Đoạn mã ví dụ trên GitHub là một chút sai lệch; Ban đầu tôi nhận được thông báo lỗi tương tự như bạn đã làm. Trong trường hợp của tôi, đó là do thực tế là tôi đã cố gắng để đọc các tập tin trước khi dòng viết đã hoàn thành. Tôi giải quyết này bằng cách làm như đọc bên trong xử lý sự kiện cho "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); 
     }); 
    }); 
}); 
Các vấn đề liên quan