MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Impossibile scrivere il buffer in MongoDB GridFS

Ora, quello che ti sei perso qui è che il "buffer" dell'opzione "inMemory" non è "o/o" e non significa che il contenuto sia invece "In memoria". Si tratta infatti di una "copia" dei dati che viene inviata anche al file temporaneo su disco.

Quindi non importa se imposti "inMemory" o meno poiché i file verranno comunque creati (per impostazione predefinita in /tmp directory ) ma questi ovviamente si scollegheranno quando non rientrano nell'ambito:

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

});

E ovviamente un semplice 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);
});

In alternativa, chiama il middleware in linea con il tuo metodo di richiesta e/o imposta onFileUploadComplete() handler piuttosto che iterare il contenuto di req.files . Il pacchetto "gridfs=stream" è probabilmente l'opzione più semplice che devi caricare contenuto e provare a lavorare da un buffer che è una copia non offrirà alcun reale vantaggio poiché il costo IO e lo spazio di archiviazione saranno sempre presenti.