MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Не може да се запише буфер в MongoDB GridFS

Това, което сте пропуснали тук, е, че „буферът“ от опцията „в паметта“ не е „или/или“ и не означава, че съдържанието се съхранява „в паметта“ вместо това. Това всъщност е „копие“ на данните, които също се изпращат във временния файл на диска.

Така че наистина няма значение дали сте задали „inMemory“ или не, тъй като файловете все още ще бъдат създадени (по подразбиране в /tmp директория ), но те разбира се ще прекратят връзката, когато са извън обхвата:

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

});

И разбира се един прост тест:

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

Алтернативно извикайте междинния софтуер на линия с вашия метод на заявка и/или настройте onFileUploadComplete() манипулатор, вместо да повтаря съдържанието на req.files . Пакетът "gridfs=stream" е може би най-простата опция, която имате за качване на съдържание и опитът да работите от буфер, който е копие, всъщност няма да предложи никакво реално предимство, тъй като разходите за IO и съхранението винаги ще бъдат там.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Комбинирайте две заявки ИЛИ с И в Mongoose

  2. Как да използвам findAndModify с драйвер Node.js MongoDB?

  3. Проверете съществуването на обект в mongo, като използвате gopkg.in/mgo.v2

  4. MongoDB findAndModify. Наистина ли е атомно? Помощ при написването на затворено решение за актуализация

  5. MongoDB извлича само съвпадащи поддокументи от документ с c#