gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 13:25:34 27 4
gpt4 key购买 nike

我正在使用 mongoose 和 gridfs-stream 从 mongodb 存储和读取文件。我在这里遵循示例:https://github.com/aheckmann/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" }

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

...
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

最佳答案

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);
});
});
});

关于node.js - 使用 node.js、mongoose、gridfs-stream 读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15380793/

27 4 0