sql >> Base de Datos >  >> NoSQL >> MongoDB

No se puede escribir el búfer en MongoDB GridFS

Ahora, lo que te perdiste aquí es que el "búfer" de la opción "en memoria" no es "o esto o lo otro" y no significa que el contenido se mantenga "en memoria". De hecho, es una "copia" de los datos que también se envía al archivo temporal en el disco.

Por lo tanto, realmente no importa si configura "inMemory" o no, ya que los archivos aún se crearán (de forma predeterminada en /tmp directorio ) pero estos, por supuesto, se desvincularán cuando estén fuera del alcance:

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

});

Y, por supuesto, una prueba sencilla:

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

Alternativamente, llame al middleware en línea con su método de solicitud y/o configure el onFileUploadComplete() controlador en lugar de iterar el contenido de req.files . El paquete "gridfs=stream" es probablemente la opción más simple que tiene para cargar contenido y tratar de trabajar desde un búfer que es una copia realmente no ofrecerá ninguna ventaja real ya que el costo de IO y el almacenamiento siempre estarán ahí.