无法将缓冲区写入MongoDB GridFS

嗨,我已经花了差不多一天的时间来试图找出这一个。 我正在使用multer的inMemory标志从我的网页上传图片。 显而易见的尝试是将从multer接收的缓冲区写入GridF(GridStore更具体)。

这是我的密码

product.js(路由/控制器)

var DB = rek('database'); var router = express.Router(); var multer = require("multer"); var uploadOptions = {inMemory:true, onFileUploadComplete: uploadDone} router.post('/product/:productId/images/', multer(uploadOptions), uploadImageResponse); function uploadDone(file) { var options = { name:file.name, mode:"w+", content_type:file.mimetype, w: "majority", chunkSize: 1024, metadata:file }; var GridStore = new DB.GridStore(DB.connection, file.name, "w+", options); GridStore.open(function(err, GS){ if(err) throw err; return GS.write(file.buffer, function(err, GS){ console.log("file written"); if(err) throw err; return GS.close(function(err, result){ if(err) throw err console.log(result); }) }) }); } 

我的数据库对象从哪里来? 我只是在初始化过程中将它添加到mongoose对象中。 这是代码的样子

database.js

 var mongoose = require("mongoose"), mongooseTimestamps = require("mongoose-concrete-timestamps"), autoIncrement = require("mongoose-auto-increment"), config = require("../config"), Grid = require("gridfs-stream"); mongoose.connect( config.database['development'].url + "" + config.database['development'].name ); var db = mongoose.connection; db.once("open", function(err){ if(err) throw err mongoose.GridStore = mongoose.mongo.GridStore }) db.on("error",function(errMsg){ console.log("Error Connecting to Mongo: " + errMsg); }); mongoose.set('debug', true); mongoose.plugin(mongooseTimestamps); autoIncrement.initialize(db); module.exports = mongoose; 

所以这是目前我自己了改变我的代码无数次,并达到相同的结果 – 没有写,没有错误

我每次都从mongoose输出日志中得到这个

 POST /product/1000/images 200 4.494 ms - 22 Mongoose: fs.chunks.ensureIndex([ [ 'files_id', 1 ], [ 'n', 1 ] ]) { w: 'majority' } Mongoose: fs.files.find({ filename: '2b08f506ed277eda45f9fc400c098aa1.jpg' }) { readPreference: 'primary', w: 'majority' } Mongoose: fs.chunks.find({ n: 0, files_id: ObjectId("54bb87aaabf2c0416a50c068") }) { readPreference: 'primary', w: 'majority' } 

如果我错了,纠正我,但是为什么当我“插入/写入”到GridFS时发现。 到目前为止,我得到了这个输出,我的断点只能让我对GridStore.open的调用,我得到了正确的stream,但是然后写入从不发生,没有错误抛出。

我到目前为止所尝试的

  1. 使用Multer的InMemory – 相同的结果
  2. 使用Multer的dest属性,并将stream从fs传送到gridfs – 结果相同。
  3. 使用gridfs-stream模块 – 相同的结果
  4. 使用本地GridFS / GridStoire – 相同的结果。

任何帮助将非常感激。

现在,您在这里错过的是,“inMemory”选项中的“缓冲区”不是“或/或”,并不意味着内容被保存在内存中。 这实际上是数据的“复制”,也被发送到磁盘上的临时文件。

所以,如果你设置了“inMemory”,或者没有创build文件(默认情况下在/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'); }); }); 

当然还有一个简单的testing:

 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”包可能是最简单的select,你必须上传内容,并且试图从一个副本的缓冲区中工作,这并不真正提供任何真正的优势,因为IO成本和存储总是在那里。