using gridfs-stream write string to gridfs
This page comes up first when searching for how to store a string data in Mongo GridFS using NodeJS. Since most of the answers here and elsewhere are based on deprecated API, I decided to post a code based on a more recent GridFSBucket. The code has an additional provision to overwrite existing files. If you don't need that - you can replace openUploadStreamWithId with openUploadStream which creates duplicates.
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();
Credit: This is assembled from a dozen of other StackOverflow pages and MongoDB API help.
Even though it's been a while. I had this problem and solved it creating a stream from the string instead of a file.Like this:
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);
Got the stream idea from here
I was faced with the same problem. I just simply deleted the file using gfs.remove and then added the updated file to GridFS.
Also FYI. I used async.series to finish the delete operation first and then write the updated file to GridFS.
Hope this helps!