我正在玩createReadStream
并且有一个加载端点,我想基本上从文本文件中读取并返回json数据。我知道formatted
数组看起来与我想要的完全一样,如果我在路线之外运行它,但我做了一些愚蠢的事情来打破这个。如果console.log
中的on.('close')
,我什么都没得到。这是我的路线:
const fs = require('fs');
const readline = require('readline').createInterface({
input: fs.createReadStream(__dirname + '/users.txt')
});
router.route('/load')
.get((req, res) => {
let data = [];
let itemised = [];
let formatted = [];
let tempObj = {
"name": "",
"phone": "",
"email": "",
"status": ""
};
readline.on('line', (line) => {
data.push(line);
});
readline.on('close', () => {
data.forEach((str) => {
itemised.push(str.split(' '));
})
itemised.forEach((innerArr) => {
const obj = innerArr.reduce(function(acc, cur, i) {
let tempKeys = Object.keys(tempObj);
acc[tempKeys[i]] = cur;
return acc;
}, {});
formatted.push(obj);
});
res.json(formatted);
});
});
.txt文件如下所示:
John 1234567890 jdoe@gmail.com active
Mary 0987654321 mary@gmail.com inactive
答案 0 :(得分:0)
注意:这是我的临时解决方法 - 非常感谢其他解决方案。
虽然我仍然对为什么我没有成功使用createReadStream感到沮丧,但我还是使用了以下解决方案。哪个好,对于小型数据文件,但如果我想处理图像或媒体文件,我更喜欢使用readline和pipe。无论如何,对于任何想要看到我不会投入生产的修复的人,请转到:
const fs = require('fs');
const readStream = fs.createReadStream(__dirname + '/users.txt');
router.route('/load')
.get((req, res) => {
let data = '';
readStream.on('data', (chunk) => {
data += chunk;
}).on('end', () => {
data = data.split("\n");
let itemised = [];
let formatted = [];
let tempObj = {
"name": "",
"phone": "",
"email": "",
"status": ""
};
data.forEach((str) => {
itemised.push(str.split(' '));
})
itemised.forEach((innerArr) => {
const obj = innerArr.reduce((acc, cur, i) => {
let tempKeys = Object.keys(tempObj);
acc[tempKeys[i]] = cur;
return acc;
}, {});
formatted.push(obj);
});
res.json(formatted);
});
});
仅供参考,我不会在媒体文件的生产级别中使用它,因为这会等待大量的块,因此我对readline和pipe感兴趣。