sql >> Database >  >> NoSQL >> MongoDB

Kan buffer niet schrijven naar MongoDB GridFS

Wat je hier hebt gemist, is dat de "buffer" van de "inMemory"-optie niet "of/of" is en niet betekent dat de inhoud in plaats daarvan "In Memory" wordt gehouden. Het is in feite een "kopie" van de gegevens die ook naar het tijdelijke bestand op schijf wordt gestuurd.

Het maakt dus echt niet uit of u "inMemory" instelt of niet, aangezien de bestanden nog steeds worden aangemaakt (standaard in de /tmp directory ) maar deze worden natuurlijk ontkoppeld als ze buiten bereik zijn:

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');
  });

});

En natuurlijk een simpele test:

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);
});

U kunt ook de middleware in-line aanroepen met uw aanvraagmethode en/of de onFileUploadComplete() instellen handler in plaats van de inhoud van req.files te herhalen . Het "gridfs=stream"-pakket is waarschijnlijk de eenvoudigste optie die je hebt om inhoud te uploaden en proberen te werken vanuit een buffer die een kopie is, zal niet echt een echt voordeel bieden, omdat de IO-kosten en opslag er altijd zullen zijn.




  1. MongoDB-verbindingsfout in Digital Ocean-druppel

  2. Te veel open bestanden en zorg ervoor dat index mongo

  3. Hoe de prestaties van ClusterControl en zijn componenten te optimaliseren

  4. Mongodb/mangoest-insert is geen functie