MongoDB Node.js Driver 3.0中Cursor与AggregateCursor的pipe用法问题
解决MongoDB Node.js Driver 3.0中Cursor.pipe()的类型错误问题
你碰到的这个报错其实很好理解——MongoDB的Cursor(不管是find还是aggregate返回的实例)默认是对象模式的流,它推送的每个chunk都是完整的JavaScript文档对象,但pipe()对接的process.stdout只接受字符串或Buffer类型的数据,直接对接自然会抛出类型不匹配的错误。
下面给你几个实用的解决方案:
方案一:手动写转换流处理对象转JSON
我们可以用Node.js内置的Transform流,把每个文档对象转换成带换行的JSON字符串,再传递给stdout:
首先引入必要模块:
const { Transform } = require('stream'); const { MongoClient } = require('mongodb');
创建一个自定义转换流:
const docToJson = new Transform({ objectMode: true, // 开启对象模式,接收文档对象 transform(doc, _, callback) { // 将文档转为JSON字符串,加换行符让输出更易读 this.push(JSON.stringify(doc) + '\n'); callback(); } });
之后就能正常pipe了:
// 假设已完成数据库连接并获取到collection实例 collection.find(query).pipe(docToJson).pipe(process.stdout); collection.aggregate(query).pipe(docToJson).pipe(process.stdout);
方案二:用第三方库简化操作
如果不想自己写转换逻辑,可以用现成的JSONStream库,它专门处理对象流和JSON格式的转换:
先安装依赖:
npm install jsonstream
然后直接使用:
const JSONStream = require('jsonstream'); // 输出格式化的JSON数组 collection.find(query).pipe(JSONStream.stringify()).pipe(process.stdout); // 或者输出每行一个独立JSON(NDJSON格式,适合日志或批量处理) collection.find(query).pipe(JSONStream.stringify(false)).pipe(process.stdout);
补充:为什么直接pipe会报错?
MongoDB驱动的Cursor流默认开启了objectMode: true,这意味着它推送的是完整的文档对象,而非字节流。而process.stdout是标准的字节流,只接受字符串或Buffer类型的数据,两者之间缺少一个“对象转字节”的转换层,这就是报错的核心原因。
内容的提问来源于stack exchange,提问作者jwerre
相关产品推荐
相关产品推荐

