gpt4 book ai didi

javascript - Express、csvtojson 和 node-walk 出现“结束后写入”错误

转载 作者:搜寻专家 更新时间:2023-10-31 23:38:35 25 4
gpt4 key购买 nike

我在使用 Express 从 csv 文件发送 JSON 数据时遇到问题。它需要一个 CSV 文件文件夹,循环遍历,将其全部转换为 JSON,然后在最后将其吐出,但我收到错误 Error: write after end 以及 ( Node )警告:检测到可能的 EventEmitter 内存泄漏。添加了 11 个听众。使用 emitter.setMaxListeners() 增加限制。 在第一次加载之后。该错误仅适用于当我尝试访问 /get 路径时,而不是主索引页面。

我知道这与关闭或未关闭读取流有关,但我没有足够的知识来确定具体要做什么。这是我的代码;任何建议都会很好。塔!

Ps,使用的技术是Express , Node-walkCSVtoJSON .

初始化.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');
});

获取数据.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);
}
});

}

最佳答案

您正在尝试为所有 请求重新使用文件 和相同的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);
});
});

}

这假设 csv 转换器在“end_parsed”上传入的 data 始终是一个数组。它结合所有文件的数据,然后在执行回调之前对数据运行过滤器。

关于javascript - Express、csvtojson 和 node-walk 出现“结束后写入”错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25431518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com