MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Puffer kann nicht in MongoDB GridFS geschrieben werden

Was Sie hier übersehen haben, ist, dass der "Puffer" der Option "inMemory" nicht "entweder/oder" ist und nicht bedeutet, dass der Inhalt stattdessen "im Speicher" gehalten wird. Es ist tatsächlich eine "Kopie" der Daten, die auch an die temporäre Datei auf der Festplatte gesendet werden.

Es spielt also keine Rolle, ob Sie "inMemory" einstellen oder nicht, da die Dateien trotzdem erstellt werden (standardmäßig im Verzeichnis /tmp Verzeichnis ), aber diese werden natürlich aufgehoben, wenn sie außerhalb des Geltungsbereichs liegen:

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

});

Und natürlich ein einfacher 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);
});

Rufen Sie alternativ die Middleware inline mit Ihrer Anforderungsmethode auf und/oder richten Sie onFileUploadComplete() ein Handler, anstatt den Inhalt von req.files zu durchlaufen . Das Paket „gridfs=stream“ ist wahrscheinlich die einfachste Option, um Inhalte hochzuladen, und der Versuch, von einem Puffer zu arbeiten, der eine Kopie ist, wird keinen wirklichen Vorteil bieten, da die E/A-Kosten und der Speicherplatz immer vorhanden sein werden.