MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Não é possível gravar buffer no MongoDB GridFS


Agora, o que você perdeu aqui é que o "buffer" da opção "inMemory" não é "ou/ou" e não significa que o conteúdo é mantido "na memória". Na verdade, é uma "cópia" dos dados que também são enviados para o arquivo temporário em disco.

Portanto, realmente não importa se você definir "inMemory" ou não, pois os arquivos ainda serão criados (por padrão no /tmp directory ), mas é claro que eles serão desvinculados quando estiverem fora do escopo:
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, claro, um teste simples:
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);
});

Como alternativa, chame o middleware em linha com seu método de solicitação e/ou configure o onFileUploadComplete() manipulador em vez de iterar o conteúdo de req.files . O pacote "gridfs=stream" é provavelmente a opção mais simples que você tem para fazer upload de conteúdo e tentar trabalhar a partir de um buffer que é uma cópia não oferecerá nenhuma vantagem real, pois o custo de IO e o armazenamento sempre estarão lá.