sql >> Databáze >  >> NoSQL >> MongoDB

Nelze zapsat vyrovnávací paměť do MongoDB GridFS

Co vám zde uniklo, je, že „buffer“ z možnosti „inMemory“ není „buď/nebo“ a neznamená to, že obsah je místo toho držen „V paměti“. Je to ve skutečnosti "kopie" dat, která se také odesílá do dočasného souboru na disku.

Takže opravdu nezáleží na tom, jestli nastavíte "inMemory" nebo ne, protože soubory se budou stále vytvářet (ve výchozím nastavení v /tmp adresář ), ale tyto se samozřejmě odpojí, když jsou mimo rozsah:

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

});

A samozřejmě jednoduchý 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);
});

Alternativně zavolejte middleware v souladu s metodou požadavku a/nebo nastavte onFileUploadComplete() spíše než iterovat obsah req.files . Balíček "gridfs=stream" je pravděpodobně nejjednodušší možností, kterou musíte nahrát obsah, a pokus o práci z vyrovnávací paměti, která je kopií, ve skutečnosti nenabídne žádnou skutečnou výhodu, protože náklady na vstup a úložiště budou vždy existovat.




  1. Rozdělení záznamů v kolekci v MongoDB

  2. F# Více atributů CLImutable DataContract

  3. Potřeba uložit vysoce přesné desetinné hodnoty v MongoDB

  4. Připojení k MongoDb pomocí SSL z aplikace JAVA