我在用Express从csv文件中发送JSON数据时遇到了问题。它需要一个CSV文件文件夹,循环遍历,将其全部转换为JSON,然后在结束时释放出来,但是在第一次加载之后,我将得到错误的Error: write after end和(node) warning: possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit.。此错误仅适用于当我尝试访问/get路径时,而不是主索引页。
我知道这与读流被关闭或不关闭有关,但我没有足够的知识来精确地计算出该做什么。这是我的代码,任何建议都会很好。阿塔!
init.js
var _ = require('underscore')._;
var express = require('express');
var server = express();
server.use(express.static(__dirname + '/frontend/public/'));
server.listen(1234);
var getData = require('./src/getData.js');
server.get('/get', function (req, res) {
getData.get(function (data) {
res.send(data);
})
});
server.get('/', function (req, res) {
res.sendFile('./index.html');
});getData.js
var walk = require('walk');
var fs = require('fs');
var _ = require('underscore')._;
var csvtojson = require('csvtojson').core.Converter;
var files = [];
var csvConverter = new csvtojson({constructResult: true});
exports.get = function (callback) {
var csvWalker = walk.walk('./place-csvs-here', {followLinks: false});
csvWalker.on('file', function (root, stat, next) {
if (stat.name.match(/[A-Z]+?\-\d+?\.csv/gi)) {
var filename = root + '/' + stat.name;
files.push(fs.createReadStream(filename));
}
next();
});
csvWalker.on('end', function () {
files.forEach(function (file) {
file.pipe(csvConverter);
});
});
csvConverter.on('end_parsed', function (data) {
if (callback) {
// Ensure rows are unique.
data = _.uniq(data, function (x) {
return JSON.stringify(x);
});
// Required fields.
data = _.filter(data, function (x) {
return (
x['Date'] !== undefined
&& x['Balance'] !== undefined
&& x['Date'] !== 'Date'
&& x['Balance'] !== 'Balance'
);
});
callback(data);
}
});
}发布于 2014-08-21 17:13:06
您正在尝试对所有请求重用files和同一个csv转换器实例。您还试图同时将多个文件输送到一个解析器实例。这可能会混淆解析器。
试一下这个getData.js:
var walk = require('walk');
var fs = require('fs');
var _ = require('underscore')._;
var csvtojson = require('csvtojson').core.Converter;
exports.get = function (callback) {
var csvWalker = walk.walk('./place-csvs-here', {followLinks: false});
var files = [];
var ret = [];
csvWalker.on('file', function (root, stat, next) {
if (stat.name.match(/[A-Z]+?\-\d+?\.csv/gi)) {
var filename = root + '/' + stat.name;
files.push(fs.createReadStream(filename));
}
next();
});
csvWalker.on('end', function () {
var left = files.length;
files.forEach(function (file) {
var csvConverter = new csvtojson({constructResult: true});
csvConverter.on('end_parsed', function (data) {
if (callback) {
if (--left === 0) {
// Ensure rows are unique.
ret = _.uniq(ret, function (x) {
return JSON.stringify(x);
});
// Required fields.
ret = _.filter(ret, function (x) {
return (
x['Date'] !== undefined
&& x['Balance'] !== undefined
&& x['Date'] !== 'Date'
&& x['Balance'] !== 'Balance'
);
});
callback(ret);
} else
ret = ret.concat(data);
}
});
file.pipe(csvConverter);
});
});
}这假设由“data”上的csv转换器传入的end_parsed总是一个数组。它组合所有文件中的数据,然后在执行回调之前对数据运行筛选器。
https://stackoverflow.com/questions/25431518
复制相似问题