Чтение файла с помощью 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)

Я погуглил и нашел несколько возможных связанных ссылок:

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

Почему gridfs получает не не работает с идентификатором файла (ObjectId) только по имени файла


person LKS    schedule 13.03.2013    source источник
comment
если я заменю имя файла на 5140392659851df70b000001, это сработает: var readstream = gfs.createReadStream('5140392659851df70b000001'). Я предполагаю, что причина связана с установкой ключа?   -  person LKS    schedule 13.03.2013
comment
Вы также можете взглянуть на реализацию потока драйверов mongodb .github.com/node-mongodb-native/api-generated/   -  person christkv    schedule 15.03.2013
comment
Просто любопытно, вы храните ссылку на файл в документе, созданном мангустом? Я изучаю использование GridFS, и мне было интересно, как люди это реализуют.   -  person Leonidas    schedule 20.03.2013
comment
fs.files хранит всю информацию о файле, а fs.chunks хранит данные файла. Mongo использует ObjectId(5140392659851df70b000001) в fs.files для поиска данных в fs.chunks. Таким образом, fs.files хранит ссылку на реальные фрагменты данных.   -  person LKS    schedule 20.03.2013


Ответы (2)


Пример кода на 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);
        });
    });
});
person Robert Mitchell    schedule 15.06.2013

что такое обложка, дайте формат файлу, чем писать или читать

const express = require("express");
const routes = express.Router();
const mongoose = require('mongoose');
mongoose.connect("mongodb://localhost:27017/gridfs");
var conn = mongoose.connection;
var path = require("path");
var Grid = require("gridfs-stream");
var fs = require("fs");
Grid.mongo = mongoose.mongo;

var datapath = path.join(__dirname, "../public/1.jpg");

conn.once("open",() =>{
    console.log('connections is opened ');
    console.log(conn.db + "wahab this is running");
    var gfs = Grid(conn.db);
    var filestream = gfs.createWriteStream({
      filename: "wahab.jpg"
    });
    fs.createReadStream(datapath).pipe(filestream);
    filestream.on("close",(file) =>{
      console.log(file.filename  + " Write to DB");
    });

 });

 });
person Sardar Abdul Wahab CH    schedule 29.03.2018