我刚刚开始学习节点流,我正在使用Mongoclient(MongoClient Cursor Doc)。在这个文档中,它声明我可以得到一个返回的查询作为一个文档流。就像这样:
var MongoClient = require('mongodb').MongoClient
, assert = require('assert');
// Connection URL
var url = 'mongodb://localhost:27017/myproject';
// Use connect method to connect to the Server
MongoClient.connect(url, function(err, db) {
assert.equal(null, err);
console.log("Connected correctly to server");
var col = db.collection('streams');
// Insert a single document
col.insert([{a:1}, {a:1}, {a:1}], function(err, r) {
assert.equal(null, err);
assert.equal(3, r.result.n);
// Get the results using a find stream
var cursor = col.find({});
cursor.on('data', function(doc) {
console.dir(doc);
});
cursor.once('end', function() {
db.close();
});
});
});
现在,我试图使用
var cursor = col.find({});
创建的流来导入through2
,并取出数据上的侦听器,最后如下所示: var cursor = col.find({});
cursor.pipe(through2(function (buf, _, next) {
console.log('chunkString: ', buf.toString());
next();
}));
但是,我得到这个错误:
/Users/blah/projects/mybuz/blah-ad/node_modules/mongodb/lib/utils.js:97
process.nextTick(function() { throw err; });
^
TypeError: Invalid non-string/buffer chunk
at validChunk (/Users/blah/projects/mybuz/blah-ad/node_modules/through2/node_modules/readable-stream/lib/_stream_writable.js:164:14)
不知道我做错了什么,因为我正在从一个可读的流管道到一个双工流,只是输出控制台上的值。
最佳答案
我也有类似的问题。结果是,我试图将mongoclient返回的对象模式流管道化为字符串/缓冲区流。这会导致错误。
从下面的片段判断:
var cursor = col.find({});
cursor.pipe(through2(function (buf, _, next) {
console.log('chunkString: ', buf.toString());
next();
}));
消费流需要缓冲区。
cursor.pipe(through2({ objectMode: true }, function(chunk, enc, next) {
console.log('chunk: ', chunk);
next();
}));
应该能解决你的问题。
资料来源:
https://nodesource.com/blog/understanding-object-streams
关于node.js - MongoClient Node 光标流和数据管道,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30602729/