MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Không thể ghi bộ đệm vào MongoDB GridFS

Bây giờ, những gì bạn đã bỏ lỡ ở đây là "bộ đệm" từ tùy chọn "inMemory" không phải là "hoặc / hoặc" và thay vào đó không có nghĩa là nội dung được giữ "Trong Bộ nhớ". Trên thực tế, nó là một "bản sao" của dữ liệu cũng được gửi đến tệp tạm thời trên đĩa.

Vì vậy, nó thực sự không quan trọng nếu bạn đặt "inMemory" hay không vì các tệp sẽ vẫn được tạo (theo mặc định trong /tmp thư mục) nhưng tất nhiên những thứ này sẽ hủy liên kết khi nằm ngoài phạm vi:

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

});

Và tất nhiên là một bài kiểm tra đơn giản:

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

Hoặc gọi nội dung trung gian bằng phương thức yêu cầu của bạn và / hoặc thiết lập onFileUploadComplete() xử lý thay vì lặp lại nội dung của req.files . Gói "gridfs =stream" có lẽ là tùy chọn đơn giản nhất mà bạn có để tải lên nội dung và cố gắng làm việc từ bộ đệm là bản sao sẽ không thực sự mang lại bất kỳ lợi thế thực sự nào vì chi phí IO và dung lượng lưu trữ luôn ở đó.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để chuẩn hóa / giảm dữ liệu thời gian trong mongoDB?

  2. phương pháp hay nhất cho danh mục lồng nhau trong Mongo và Meteor

  3. 3 cách xóa giá trị khỏi mảng trong MongoDB

  4. Làm cách nào để MongoDB sắp xếp tài liệu của họ trong một bộ sưu tập?

  5. Làm thế nào để xử lý các truy vấn phân trang đúng cách với mongodb và php?