Javascript Node.js:从MongoDB到文件的流式传输
我对javascript/node.js相当陌生,正在尝试一个非常基本的场景:连接到MongoDB,将JSON响应转换为CSV,然后将其写入文件。我已经试过了,如下所示Javascript Node.js:从MongoDB到文件的流式传输,javascript,node.js,mongodb,csv,streaming,Javascript,Node.js,Mongodb,Csv,Streaming,我对javascript/node.js相当陌生,正在尝试一个非常基本的场景:连接到MongoDB,将JSON响应转换为CSV,然后将其写入文件。我已经试过了,如下所示 fs = require('fs'); var MongoClient = require('mongodb').MongoClient; var Db = require('mongodb').Db; var Server = require('mongodb').Server; var Json2csvStream = re
fs = require('fs');
var MongoClient = require('mongodb').MongoClient;
var Db = require('mongodb').Db;
var Server = require('mongodb').Server;
var Json2csvStream = require('json2csv-stream');
var Stream = require('stream');
var JSONStream = require('JSONStream');
var es = require('event-stream');
var csv = require('csv');
var fields = ['execAmendTime', 'execTime', 'execType', 'lastMkt', 'manualExecFlag', 'orderId', 'riskTrade', 'rootOrdId', 'salesCommissionRate', 'salesCommissionType', 'theoPov20Px',
'theoPov20BL', 'tradeFlags', 'tradeNotes', 'transactTime', 'version', 'book.bookName', 'businessUnit', 'commissionRate', 'commissionSource', 'commissionType', 'counterBook.bookName',
'counterParty.name', 'createTime', 'currency', 'direction', 'execQuantity', 'fxRate','orderQuantity', 'positionTrader.name', 'price', 'primaryTrader.name','rootSystem', 'source',
'sectorGicsLevel1', 'salesTrader.name', 'tradedPrice', 'isCRB', 'clientCategory', 'tradeId', 'tradeDate', 'instrument.instrumentRic', 'notionalUSD','commissionUSD', 'region'];
// Connect to the db
MongoClient.connect("mongodb://*****", function (err, db) {
if (err) { return console.dir(err); }
if (!err) {
console.log("We are connected");
}
db.open(function (err, db) {
if (err) { return console.dir(err); }
var newDb = db.db("test_db");
var collection = newDb.collection('test', function (err, collection) {
if (err) { return console.dir(err); }
var parser = new Json2csvStream();
var writer = fs.createWriteStream('out.csv');
var stream = collection.find({ tradeDate: new Date('2015-12-29T00:00:00.000Z') }).stream();
stream.pipe(parser).pipe(writer);
stream.on("data", function (item) {
console.log(item);
});
stream.on('end', function () {
console.log("ended");
});
stream.on("end", function () {
newDb.close();
db.close();
});
});
});
});
我得到的错误如下
我试图用JSON.stringify等添加转换,但没有一次成功。似乎我需要等到Mongo的查询流完成后,才能开始将其提供给json2csv转换器
有什么想法吗?我在这里犯了什么根本性的错误吗
非常感谢
输出:
We are connected
D:\WebTrial\MongoProject\node_modules\mongodb\lib\utils.js:98
process.nextTick(function() { throw err; });
^
TypeError: Invalid non-string/buffer chunk
at validChunk (_stream_writable.js:178:14)
at Writable.write (_stream_writable.js:205:12)
at ondata (_stream_readable.js:525:20)
at emitOne (events.js:82:20)
at emit (events.js:169:7)
at readableAddChunk (_stream_readable.js:146:16)
at Readable.push (_stream_readable.js:110:10)
at D:\WebTrial\MongoProject\node_modules\mongodb\lib\cursor.js:1102:10
at handleCallback (D:\WebTrial\MongoProject\node_modules\mongodb\lib\utils.j
s:96:12)
at D:\WebTrial\MongoProject\node_modules\mongodb\lib\cursor.js:673:5
这是因为find().stream()
streams对象,而Json2csvStream
需要字符串。事件流可以帮助您将对象字符串化。我还简化了你的代码,有一些不必要的东西:
var fs = require('fs');
var MongoClient = require('mongodb').MongoClient;
var es = require('event-stream');
var Json2csvStream = require('json2csv-stream');
// var Db = require('mongodb').Db;
// var Server = require('mongodb').Server;
// var Stream = require('stream');
// var JSONStream = require('JSONStream');
// var csv = require('csv');
var fields = ['execAmendTime', 'execTime', 'commissionUSD', 'region'];
// Connect to the db
// you can put the db name in the url
MongoClient.connect("mongodb://localhost:27017/test_db", function (err, db) {
if (err) {
return console.dir(err);
} else {
console.log("We are connected");
}
// without strict: true, err is always null
// in strict mode, there is an err if the collection doesn't exist
db.collection('test', { strict: true }, function (err, collection) {
if (err) {
return console.dir(err);
}
var json2csv = new Json2csvStream();
var writer = fs.createWriteStream('out.csv');
var mongoStream = collection.find(
{ tradeDate: new Date('2015-12-29T00:00:00.000Z') }
).stream();
var stream = mongoStream
.pipe(es.map(function (doc, next) {
doc = JSON.stringify(doc);
// console.log(doc);
next(null, doc);
})).pipe(json2csv).pipe(writer).on('close', function () {
console.log('done...');
db.close();
});
});
});
这是因为find().stream()
streams对象,而Json2csvStream
需要字符串。事件流可以帮助您将对象字符串化。我还简化了你的代码,有一些不必要的东西:
var fs = require('fs');
var MongoClient = require('mongodb').MongoClient;
var es = require('event-stream');
var Json2csvStream = require('json2csv-stream');
// var Db = require('mongodb').Db;
// var Server = require('mongodb').Server;
// var Stream = require('stream');
// var JSONStream = require('JSONStream');
// var csv = require('csv');
var fields = ['execAmendTime', 'execTime', 'commissionUSD', 'region'];
// Connect to the db
// you can put the db name in the url
MongoClient.connect("mongodb://localhost:27017/test_db", function (err, db) {
if (err) {
return console.dir(err);
} else {
console.log("We are connected");
}
// without strict: true, err is always null
// in strict mode, there is an err if the collection doesn't exist
db.collection('test', { strict: true }, function (err, collection) {
if (err) {
return console.dir(err);
}
var json2csv = new Json2csvStream();
var writer = fs.createWriteStream('out.csv');
var mongoStream = collection.find(
{ tradeDate: new Date('2015-12-29T00:00:00.000Z') }
).stream();
var stream = mongoStream
.pipe(es.map(function (doc, next) {
doc = JSON.stringify(doc);
// console.log(doc);
next(null, doc);
})).pipe(json2csv).pipe(writer).on('close', function () {
console.log('done...');
db.close();
});
});
});
您能指出stacktrace的最后三行所指的是源代码的哪一行吗?您能指出stacktrace的最后三行所指的是源代码的哪一行吗?非常感谢您的回复!我将在星期一试一试!嗨,我今天试过了。现在出现不同的错误消息(请参见下文)。D:\WebTrial\MongoProject\node\u modules\mongodb\lib\utils.js:98 process.nextTick(function(){throw err;});^语法错误:MyStream.writeHeader(D:\WebTrial\MongoProject\node\u modules\json2csv stre am\index.js:115:17)处的Object.parse(native)输入意外结束。transform处的转换(D:\WebTrial\MongoProject\node\modules\json2csv strea m\index.js:95:55)。读取(\u stream\u transform\u transform.js:167:10)…我是否需要添加一些东西来处理空值或空值?@JenniferTenzer我尝试了一个复杂的文档,但我得到了相同的错误,您的文档是否有子文档
Json2csvStream
执行一个非常基本的检查来查找JSON(它只查找一个{和一个},如果它收到{“foo”:{“bar”:“bar”},“baz”:“baz”}
,它将尝试解析做了一个非常基本的检查来查找JSON(如果它收到{“foo”:{“bar”:“bar”}
Json2csvStream
{foo:{bar:“bar},它只需查找一个{和一个}),baz:“baz”}
,它将尝试解析{foo:{bar:“bar”}
),因此它只适用于简单文档。我将尝试查找另一个模块。