我有以下代码(修剪,假设所有关闭的东西都在那里),它在GridFS内部深处死亡:
var Grid = require('mongodb').Grid;
var mongoose = require('mongoose');
var db = mongoose.connect('mongodb://localhost:27017/ksnap');
router.route('/').post(function(req, res) {
var post = new Post();
var busboy = new Busboy({ headers: req.headers });
req.pipe(busboy);
busboy.on('file', function(fieldname, file, filename, encoding, mimetype) {
console.log('File [' + fieldname + ']: filename: ' + filename + ', encoding: ' + encoding + ', mimetype: ' + mimetype);
if (fieldname != 'img') { return; }
var bufs = [];
file.on('data', function(data) {
console.log('File [' + fieldname + '] got ' + data.length + ' bytes');
bufs.push(data);
}); // busboy file on data
file.on('end', function() {
console.log('File [' + fieldname + '] Finished');
var buf = Buffer.concat(bufs);
var grid = new Grid(db, 'fs');
grid.put(buf, {metadata:{category:'image'}, content_type: 'image'}, function(err, result) {
if (err) { console.log(err); } else { console.log(result); }
});
堆栈追踪:
/opt/ksnap-server/node_modules/mongodb/lib/mongodb/gridfs/gridstore.js:1552
} else if(self.safe.w != null || typeof self.safe.j == 'boolean' || typeof s
^
TypeError: Cannot read property 'w' of undefined
at _getWriteConcern (/opt/ksnap-server/node_modules/mongodb/lib/mongodb/gridfs/gridstore.js:1552:22)
at Stream.GridStore (/opt/ksnap-server/node_modules/mongodb/lib/mongodb/gridfs/gridstore.js:100:23)
at Grid.put (/opt/ksnap-server/node_modules/mongodb/lib/mongodb/gridfs/grid.js:52:19)
at FileStream.<anonymous> (/opt/ksnap-server/server.js:83:13)
at FileStream.emit (events.js:117:20)
at _stream_readable.js:943:16
at process._tickCallback (node.js:419:13)
Busboy返回一个我放入缓冲区的流,到目前为止一直很好。这很好,我已经测试过了。但是当我尝试grid.put()缓冲区时,它会像上面那样死掉。我试图追踪它,但我遇到了麻烦。 据我所知,所有的选项都在grid.js中被吃掉了,所以当它们传递给gridstore.js时,它只是一个空对象。 Mongoose就是没有& #39;设置这个,我想。
答案 0 :(得分:2)
我可以通过在打开连接后手动设置db.safe = {w: 1};
来解决此错误,但是当我执行grid.put()
时它只是卡在那里。交换mongoose以进行常规mongodb连接工作,所以我猜当前mongoose只是不能使用GridFS。
我终于能够通过添加streamifier和gridfs-stream模块以及以下mongo设置来显示所有内容(显然):
var streamifier = require('streamifier');
var Grid = require('gridfs-stream');
mongoose.connect('mongodb://localhost:27017/ksnap');
然后,当我准备将文件保存到GridFS时:
var gfs = new Grid(mongoose.connection.db, mongoose.mongo);
var writestream = gfs.createWriteStream({
mode: 'w',
filename: post.id,
content_type: 'image/jpeg'
});
streamifier.createReadStream(buffer).pipe(writestream);
writestream.on('close', function (file) {
console.log("saved 300px as "+file.filename);
});
将帖子文档本身保存到MongoDB:
post.save(function(err) {
if (err) { res.send(err); }
console.log('saved post '+post.id);
res.send(post);
});
这是对我有用的选项组合。其中一个关键是使用mongoose.connect()
,而不是mongoose.createConnection()
,这可以让我保存文件,但不能保存文档。
答案 1 :(得分:-1)
我知道这已经有一段时间了 - 我看到同样的问题 - 确保你的mongoose会话连接到数据库 - 即
已调用mongoose.connection.once("connected", function () {...}
,然后加载require文件和文件。这可确保连接中的db对象绑定到现有的mongo会话。如果您发现mongoose.connection.db
为空且mongoose.connection
为非null,那么您将使用未初始化的mongodb连接初始化网格流。