【问题标题】:using gridfs-stream write string to gridfs使用 gridfs-stream 将字符串写入 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");
});

【问题讨论】:

    标签: node.js mongodb mongoose gridfs gridfs-stream


    【解决方案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();
    

    致谢:这是由十几个其他 StackOverflow 页面和 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。

        希望这会有所帮助!

        【讨论】:

          猜你喜欢
          • 2015-07-18
          • 2013-08-22
          • 1970-01-01
          • 1970-01-01
          • 2016-06-22
          • 2016-09-21
          • 1970-01-01
          • 2013-06-12
          • 2021-03-31
          相关资源
          最近更新 更多