MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Nie można zapisać bufora do MongoDB GridFS

To, czego tutaj przegapiłeś, to to, że "bufor" z opcji "inMemory" nie jest "albo/albo" i nie oznacza, że ​​zawartość jest przechowywana w "In Memory". W rzeczywistości jest to „kopia” danych, która jest również wysyłana do tymczasowego pliku na dysku.

Więc naprawdę nie ma znaczenia, czy ustawisz "inMemory", czy nie, ponieważ pliki będą nadal tworzone (domyślnie w /tmp directory ), ale te oczywiście zostaną odłączone, gdy są poza zakresem:

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

});

I oczywiście prosty 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);
});

Alternatywnie wywołaj oprogramowanie pośredniczące w linii z metodą żądania i/lub skonfiguruj onFileUploadComplete() obsługi zamiast iterować zawartość req.files . Pakiet "gridfs=stream" jest prawdopodobnie najprostszą opcją, jaką musisz przesłać zawartość, a próba pracy z bufora, który jest kopią, tak naprawdę nie przyniesie żadnych realnych korzyści, ponieważ koszt IO i pamięć zawsze tam będą.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Aktualizujesz dokument podrzędny w mongodb?

  2. PyMongo vs MongoEngine dla Django

  3. Jak zaimplementować tożsamość ASP.NET Core 3.1 za pomocą MongoDB?

  4. Uruchomienie PHP Nie można załadować biblioteki dynamicznej php_mongo.dll

  5. Docker mongodb udostępnia wolumin z systemem Mac OS X