[英]Read file with node.js, mongoose, gridfs-stream
I am using mongoose and gridfs-stream to store and read files from mongodb.我正在使用 mongoose 和 gridfs-stream 来存储和读取来自 mongodb 的文件。 I am following the example here: https://github.com/aheckmann/gridfs-stream
我在下面的例子: https : //github.com/aheckmann/gridfs-stream
Writing files into db is working fine but I faced a problem to read files.将文件写入 db 工作正常,但我在读取文件时遇到了问题。
What the mongodb looks (show collections) mongodb 的样子(显示集合)
fs.chunks
fs.files
What the file index looks (db.fs.files.find())文件索引的样子(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"然后我使用此代码获取名为“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 https://github.com/mongodb/node-mongodb-native/issues/621
Why gridfs get isn't working on file id (ObjectId) only by filename 为什么 gridfs get 不能仅通过文件名处理文件 id (ObjectId)
The example code on GitHub was a little bit misleading; GitHub 上的示例代码有点误导; 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"
:我通过在事件处理程序中读取
"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);
});
});
});
what is cover give an format to file than write or read什么是封面给文件一种格式而不是写或读
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");
});
});
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.