语境
我正在使用事件流模块来帮助我读取和写入这些我希望返回结果文件的本地文件。长话短说,multipart/form-data
我期望的 2 个输入文件(通过 express API as 发送)的大小可以超过 200MB,其中包含一个条目列表(每行 1 个)。我想做的是以以下格式组合这些条目,<entry1>:<entry2>
其中entry1
第一个文件中的条目和entry2
来自第二个文件。我之前以一种能够在内存中存储和返回输入/输出的方式执行此操作,但是由于我的应用程序服务器上的内存空间非常有限,我的堆内存不足。我读到我可以使用事件流和管道逐行读取每个文件并输出到文件,而不是使用读取流输出到内存中的大字符串。问题是我似乎无法以正确的方式/时间解决问题,以便准备好将生成的输出文件发送回调用者。
到目前为止我所拥有的
到目前为止,我所做的工作是我得到了我期望的正确文件输出,但是,这似乎是一个异步问题,因为我在文件实际完成写入/保存之前解决了承诺。请在下面查看我的代码...
const fs = require('fs');
const es = require('event-stream');
const uuid = require('uuid');
const buildFile = async (fileOne, fileTwo) =>
await new Promise((resolve, reject) => {
try {
// Output stream
let fileID = uuid.v4();
let outStream = fs
.createWriteStream(`files/outputFile-${fileID}.txt`, {
flags : 'a',
encoding : 'utf-8'
});
let fileOneRS = fs
.createReadStream(fileOne.path, {
flags : 'r',
encoding : 'utf-8'
})
.pipe(es.split())
.pipe(
es.mapSync((lineOne) => {
fileOneRS.pause();
let fileTwoRS = fs
.createReadStream(fileTwo.path, {
flags : 'r',
encoding : 'utf-8'
})
.pipe(es.split())
.pipe(
es.mapSync((lineTwo) => {
fileTwoRS.pause();
// Write combo to file
outStream.write(`${lineOne}:${lineTwo}\n`);
fileTwoRS.resume();
})
);
fileOneRS.resume();
})
); // This is where I have tried doing .on('end', () => resolve), but it also does not work :(
} catch (err) {
reject(err);
}
});
注意:这个函数是从另一个服务函数调用的,如下所示:
buildFile(fileOne, fileTwo)
.then((result) => {
resolve(result);
})
.catch((err) => {
console.log(err);
reject(err);
});
作为一个新手 Javascript 开发人员,甚至是 NodeJS 的新手,我已经坚持尝试自己解决这个问题超过 2 周了。如果有人能够提供帮助,我将非常感谢这里的一些智慧!
谢谢