sql >> Databasteknik >  >> NoSQL >> MongoDB

Det går inte att skriva buffert till MongoDB GridFS

Nu, vad du missade här är att "bufferten" från alternativet "inMemory" inte är "antingen/eller" och betyder inte att innehållet hålls "I minnet" istället. Det är i själva verket en "kopia" av datan som också skickas till den temporära filen på disken.

Så det spelar egentligen ingen roll om du ställer in "inMemory" eller inte eftersom filerna fortfarande kommer att skapas (som standard i /tmp katalog ) men dessa kommer naturligtvis att ta bort länken när de inte omfattas:

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

});

Och naturligtvis ett enkelt 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 kan du anropa middleware i linje med din begäranmetod och/eller ställa in onFileUploadComplete() hanterare istället för att iterera innehållet i req.files . Paketet "gridfs=stream" är förmodligen det enklaste alternativet du har för att ladda upp innehåll och att försöka arbeta från en buffert som är en kopia kommer inte att ge någon verklig fördel eftersom IO-kostnaden och lagringen alltid kommer att finnas där.




  1. Hur man inspekterar och avbryter selleriuppgifter efter uppgiftsnamn

  2. Hur använder man redis PUBLISH/SUBSCRIBE med nodejs för att meddela klienter när datavärden ändras?

  3. Mongodb:Hitta dokument med array där minst ett element inte matchar ObjectID

  4. Hur man byter ut sträng i alla dokument i Mongo