使用 gridfs-stream 将字符串写入 gridfs
Posted
技术标签:
【中文标题】使用 gridfs-stream 将字符串写入 gridfs【英文标题】:using gridfs-stream write string to gridfs 【发布时间】:2015-02-27 18:56:01 【问题描述】:我是通过 sn-p 来将文件写入 gridfs,但我无法找到将字符串更新到 Gridfs 的写入方式。
下面的sn-p会使用路径更新,但是直接字符串缓冲区呢?
var metadata =
"path": path
;
var writestream = gfs.createWriteStream(
filename: name,
mode: 'w',
content_type: type,
metadata: metadata
);
fs.createReadStream(path).pipe(writestream);
// var buf = new Buffer("hello");
writestream.on('close', function (file)
console.log("Gridfs created");
);
【问题讨论】:
【参考方案1】:当搜索如何使用 NodeJS 在 Mongo GridFS 中存储字符串数据时,首先出现此页面。由于此处和其他地方的大多数答案都基于已弃用的 API,因此我决定发布基于更新的 GridFSBucket 的代码。该代码具有覆盖现有文件的附加条款。如果您不需要 - 您可以将 openUploadStreamWithId 替换为 openUploadStream ,它会创建重复项。
var mongo = require('mongodb');
var stream = require('stream');
var MongoClient = mongo.MongoClient;
function getFileSystemItem(dbo, filename)
var buf = new Buffer('');
return new Promise(function(resolve, reject)
var bucket = new mongo.GridFSBucket(dbo);
var readstream = bucket.openDownloadStream(filename);
readstream.on('data', (chunk) =>
buf = Buffer.concat([buf, chunk]);
);
readstream.on('error', (err) =>
reject(err);
);
readstream.on('end', () =>
var res = buf.toString();
buf = null; // Clean up memory
readstream.destroy();
resolve(res);
);
);
function putFileSystemItem(dbo, filename, data)
var putItemHelper = function(bucket, resolve, reject)
var writeStream = bucket.openUploadStreamWithId(filename, filename);
var s = new stream.Readable();
s.push(data);
s.push(null); // Push null to end stream
s.pipe(writeStream);
writeStream.on('finish', resolve);
writeStream.on('error', reject);
;
return new Promise(function(resolve, reject)
var bucket = new mongo.GridFSBucket(dbo);
bucket.find(_id: filename).count(function(err, count)
if (err) return reject(err);
if (count > 0)
bucket.delete(filename, function()
putItemHelper(bucket, resolve, reject);
, reject)
else
putItemHelper(bucket, resolve, reject);
, reject);
);
function test()
var MongoUrl = 'mongodb://localhost:27017';
var dbName = 'test';
MongoClient.connect(MongoUrl, function(err, db)
if (err) throw err;
var dbo = db.db(DbName);
putFileSystemItem(dbo, 'test', 'this is a test')
.then(function(a)
console.log('Wrote a gridFS file with metadata:', a);
return getFileSystemItem(dbo, 'test')
)
.then(function(a)
console.log('Got data back from a gridFS file:', a);
db.close();
)
.catch(function(e)
console.log(e);
db.close();
)
);
test();
致谢:这是由十几个其他 *** 页面和 MongoDB API 帮助组合而成的。
【讨论】:
【参考方案2】:虽然已经有一段时间了。我遇到了这个问题并解决了它从字符串而不是文件创建流。 像这样:
var writestream = gfs.createWriteStream(
filename: fileName
);
// Create stream with buffer to pipe to writestream
var s = new stream.Readable();
s.push(pic);
s.push(null); // Push null to end stream
s.pipe(writestream);
writestream.on('close', function (file)
// Do anything with the file
cb(null, file.filename);
).on('error', cb);
从here得到了流的想法
【讨论】:
【参考方案3】:我也遇到了同样的问题。我只是简单地使用 gfs.remove 删除了文件,然后将更新的文件添加到 GridFS。
也仅供参考。我使用async.series先完成删除操作,然后将更新后的文件写入GridFS。
希望这会有所帮助!
【讨论】:
以上是关于使用 gridfs-stream 将字符串写入 gridfs的主要内容,如果未能解决你的问题,请参考以下文章
gridfs-stream 总是用“contentType: binary/octet-stream”存储文件