MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Impossible d'écrire le tampon dans MongoDB GridFS

Maintenant, ce que vous avez manqué ici, c'est que le "tampon" de l'option "inMemory" n'est pas "soit/ou" et ne signifie pas que le contenu est conservé "en mémoire" à la place. Il s'agit en fait d'une "copie" des données qui est également envoyée dans le fichier temporaire sur disque.

Donc, peu importe si vous définissez "inMemory" ou non car les fichiers seront toujours créés (par défaut dans le /tmp directory ) mais ceux-ci seront bien sûr dissociés lorsqu'ils seront hors de portée :

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

});

Et bien sûr un test simple :

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

Appelez alternativement le middleware en ligne avec votre méthode de requête et/ou configurez le onFileUploadComplete() gestionnaire plutôt que d'itérer le contenu de req.files . Le package "gridfs=stream" est probablement l'option la plus simple dont vous disposez pour télécharger du contenu et essayer de travailler à partir d'un tampon qui est une copie n'offrira pas vraiment d'avantage réel puisque le coût et le stockage des E/S seront toujours là.