sql >> データベース >  >> NoSQL >> MongoDB

MongoDBGridFSにバッファーを書き込めません

    ここで見逃したのは、「inMemory」オプションの「buffer」が「どちらか/または」ではなく、代わりにコンテンツが「InMemory」に保持されることを意味しないということです。実際には、ディスク上の一時ファイルにも送信されるデータの「コピー」です。

    したがって、ファイルは引き続き作成されるため、「inMemory」を設定するかどうかは実際には問題ではありません(デフォルトでは/tmpにあります)。 ディレクトリ)が、スコープ外の場合はもちろんこれらはリンクを解除します:

    var async = require('async'),
        express = require('express'),
        multer = require('multer'),
        fs = require('fs'),
        mongoose = require('mongoose'),
        Grid = require('gridfs-stream'),
        Schema = mongoose.Schema;
    
    Grid.mongo = mongoose.mongo;
    var app = express(),
        gfs = {};
    
    // Set up multer middleware
    app.use(
      multer({
        //inMemory: true
      })
    );
    
    // Register handler
    app.post('/',function (req,res) {
    
      async.eachLimit(Object.keys(req.files), 10, function(file,callback) {
        var fileobj = req.files[file];
    
        var writeStream = gfs.createWriteStream({
          "filename": fileobj.fieldname
        });
    
        fs.createReadStream(fileobj.path).pipe(writeStream);
    
        writeStream.on('close',function() {
          console.log('done');
          callback();
        });
    
        writeStream.on('error',callback);
    
      },function(err) {
        if (err) {
          console.log(err);
          res.status(500).end();
        }
        res.status(200).end();
      });
    
    });
    
    mongoose.connect('mongodb://localhost/test');
    
    
    // Start app listen and events
    var server = app.listen(3000,function() {
    
      mongoose.connection.on('open',function(err) {
        if (err) throw err;
        // Set up connection
        gfs = Grid(mongoose.connection.db);
        console.log('listening and connected');
      });
    
    });
    

    そしてもちろん簡単なテスト:

    var FormData = require('form-data'),
        fs = require('fs'),
        http = require('http');
    
    var fname  = 'GearsLogo.png';
    var form = new FormData();
    form.append(fname,fs.createReadStream(fname))
    
    var request = http.request({
      method: 'post',
      port: 3000,
      headers: form.getHeaders()
    });
    
    form.pipe(request);
    
    request.on('response',function(res) {
      console.log(res.statusCode);
    });
    

    または、リクエストメソッドに沿ってミドルウェアをインラインで呼び出すか、onFileUploadComplete()を設定します。 req.filesのコンテンツを反復するのではなくハンドラー 。 「gridfs=stream」パッケージは、コンテンツをアップロードする必要がある最も簡単なオプションであり、コピーであるバッファーから作業を試みることは、IOコストとストレージが常に存在するため、実際には何の利点も提供しません。




    1. Mochaがテストスイートで最初にロードするファイルを知る方法

    2. useMongoClient(Mongoose 4.11.0)を設定するにはどうすればよいですか?

    3. サブドキュメントの配列でMongoDBドキュメントを更新する方法

    4. MongoDB-印刷