Javascript 带有Mongoose的GridFS put()在写关注点代码中死亡?
我有以下代码(经过修剪,假设所有的结尾都在那里),这些代码在GridFS中死得很深:Javascript 带有Mongoose的GridFS put()在写关注点代码中死亡?,javascript,node.js,mongodb,mongoose,gridfs,Javascript,Node.js,Mongodb,Mongoose,Gridfs,我有以下代码(经过修剪,假设所有的结尾都在那里),这些代码在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 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)
/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:无法读取未定义的属性“w”
在_getWriteConcern(/opt/ksnap server/node\u modules/mongodb/lib/mongodb/gridfs/gridstore.js:1552:22)
在Stream.GridStore(/opt/ksnap server/node_modules/mongodb/lib/mongodb/gridfs/GridStore.js:100:23)
在Grid.put(/opt/ksnap server/node_modules/mongodb/lib/mongodb/gridfs/Grid.js:52:19)
在文件流中。(/opt/ksnap server/server.js:83:13)
在FileStream.emit(events.js:117:20)
在_stream_readable.js:943:16
在进程中调用(node.js:419:13)
Busboy返回一个我放入缓冲区的流,目前为止还不错。这很好,我已经测试过了。但是当我尝试使用grid.put()时缓冲区,如上所述。我试图跟踪它,但我遇到了问题。据我所知,所有的选项都在grid.js中被吃掉了,所以当它们传递到gridstore.js时,它只是一个空对象。我猜Mongoose只是没有设置它。我可以通过手动设置
db.safe={w:1}来克服这个错误打开连接后,当我执行grid.put()
时,它就卡在那里了。将mongoose替换为常规的mongodb连接起作用了,所以我想目前mongoose不适用于GridFS
通过添加和模块以及以下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);
});
并将post文档本身保存到MongoDB:
post.save(function(err) {
if (err) { res.send(err); }
console.log('saved post '+post.id);
res.send(post);
});
这是对我有效的选项组合。其中一个键是使用mongoose.connect()
,而不是mongoose.createConnection()
,这将允许我保存文件,但不保存文档。我知道这已经有一段时间了-我看到了相同的问题-确保您的mongoose会话已连接到DB-ie
mongoose.connection.once(“connected”,function(){…}
已被调用,然后加载require文件和文件。这确保连接中的db对象绑定到现有的mongo会话。如果您发现mongoose.connection.db
为null且mongoose.connection
不为null,则您将使用未初始化的mongodb连接初始化网格流。