sql >> Database teknologi >  >> NoSQL >> MongoDB

Kan ikke skrive buffer til MongoDB GridFS

Nu, hvad du gik glip af her er, at "bufferen" fra "inMemory"-indstillingen ikke er "enten/eller" og betyder ikke, at indholdet holdes "In Memory" i stedet. Det er faktisk en "kopi" af dataene, der også sendes til den midlertidige fil på disken.

Så det er virkelig ligegyldigt, om du indstiller "inMemory" eller ej, da filerne stadig vil blive oprettet (som standard i /tmp mappe ), men disse vil naturligvis fjerne linket, når de er uden for scope:

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

});

Og selvfølgelig en simpel 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);
});

Alternativt kald middle-ware in-line med din anmodningsmetode og/eller opsæt onFileUploadComplete() handler i stedet for at iterere indholdet af req.files . "gridfs=stream"-pakken er nok den enkleste mulighed, du har for at uploade indhold, og at prøve at arbejde fra en buffer, der er en kopi, vil ikke give nogen reel fordel, da IO-omkostningerne og -lagringen altid vil være der.




  1. Hvad svarer til findOne, der bruger .aggregate i Mongodb?

  2. Bevægende gennemsnit med MongoDB's aggregeringsramme?

  3. Hvordan serialiseres et kort i Java til lagring i Redis?

  4. Opdaterer element i array med unikt ID