Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript NodeJS:如何使用管道读取两个文件并写入单个输出文件? 上下文_Javascript_Node.js_Express_Pipe_Event Stream - Fatal编程技术网

Javascript NodeJS:如何使用管道读取两个文件并写入单个输出文件? 上下文

Javascript NodeJS:如何使用管道读取两个文件并写入单个输出文件? 上下文,javascript,node.js,express,pipe,event-stream,Javascript,Node.js,Express,Pipe,Event Stream,我正在使用事件流模块来帮助我读写这些本地文件,我希望返回一个结果文件。长话短说,我期望的2个输入文件(通过express API作为多部分/表单数据发送))的大小可以超过200MB,其中包含一个条目列表(每行1个)。我想做的是将这些条目组合成以下格式:,其中entry1是来自第一个文件的条目,entry2是来自第二个文件的条目。我以前是这样做的,我可以在内存中存储和返回输入/输出,但是由于应用服务器上的内存空间非常有限,所以堆上的内存不足。我读到,我可以使用事件流和管道逐行读取每个文件,并输出到

我正在使用事件流模块来帮助我读写这些本地文件,我希望返回一个结果文件。长话短说,我期望的2个输入文件(通过express API作为
多部分/表单数据发送)
)的大小可以超过200MB,其中包含一个条目列表(每行1个)。我想做的是将这些条目组合成以下格式:,其中
entry1
是来自第一个文件的条目,
entry2
是来自第二个文件的条目。我以前是这样做的,我可以在内存中存储和返回输入/输出,但是由于应用服务器上的内存空间非常有限,所以堆上的内存不足。我读到,我可以使用事件流和管道逐行读取每个文件,并输出到文件,而不是使用读取流输出到内存中的大字符串。问题是,我似乎无法以正确的方式/时间解决问题,以便生成的输出文件可以发送回调用方

到目前为止我所拥有的 到目前为止,我所做的工作是获得我期望的正确的文件输出,然而,这似乎是一个异步性问题,因为我在文件实际完成写入/保存之前解决了承诺。请看下面我的代码

const fs=require('fs');
const es=require(‘事件流’);
const uuid=require('uuid');
const buildFile=async(fileOne,fileTwo)=>
等待新的承诺((决定,拒绝)=>{
试一试{
//输出流
让fileID=uuid.v4();
让外流=fs
.createWriteStream(`files/outputFile-${fileID}.txt`{
旗:"a",,
编码:“utf-8”
});
让fileOneRS=fs
.createReadStream(fileOne.path{
旗帜:“r”,
编码:“utf-8”
})
.pipe(es.split())
.烟斗(
es.mapSync((lineOne)=>{
pause();
让fileTwoRS=fs
.createReadStream(fileTwo.path{
旗帜:“r”,
编码:“utf-8”
})
.pipe(es.split())
.烟斗(
es.mapSync((第二行)=>{
fileTwoRS.pause();
//将组合写入文件
write(${lineOne}:${lineTwo}\n`);
resume();
})
);
resume();
})
);//这就是我尝试的地方。在('end',()=>resolve)上,但它也不起作用:(
}捕捉(错误){
拒绝(错误);
}
});
注意:此函数是从另一个服务函数调用的,如下所示:

buildFile(fileOne,fileTwo)
。然后((结果)=>{
决心(结果);
})
.catch((错误)=>{
控制台日志(err);
拒绝(错误);
});
作为一名Javascript开发新手,甚至是NodeJS的新手,我一直在努力自己解决这个问题,现在已经有两个多星期了。如果有人能够提供帮助,我将非常感谢这里的一些智慧


谢谢编辑:更新代码以符合OP的预期输出

写入流完成后,应调用promise“
resolve()
函数。OP代码段中提供的注释表明,可能在排空
文件管理器时(在管道()链的末尾)调用了resolve函数

代码不应该为第一个文件中的每一行创建新的读取流,而应该只实例化一次读取流

以下示例说明了如何重构此代码流,使每一行只读取一次,并逐行连接文件A和B中的行:

从“流”导入流;
从“util”导入util;
从“readline”导入readline;
从“fs”导入fs;
从“操作系统”导入操作系统;
/**将可读流作为文本行上的异步iterable返回*/
函数lineIteratorFromFile(文件流){
返回readline.createInterface({
输入:fileStream,
crlfDelay:无穷大
})
}
//使用stream.pipeline处理错误并对组合输出进行流式处理
//到可写流。承诺将在数据完成后解析
//写入输出流。
等待使用
.promisify(溪流管道)(
异步函数*(){
对于wait(lineIteratorFromFile(fs.createReadStream(“./in1.txt”))的常量lineA){
对于wait(lineIteratorFromFile(fs.createReadStream(“./in2.txt”))的常量lineB){
产生`${lineA}:${lineB}${os.EOL}`
}
}
},
fs.createWriteStream(输出文件)
);
下面折叠的代码段中提供了NodeJS v13+的可运行示例:

//in1.txt:
foo1
食物2
//in2.txt:
bar1
bar2
//out.txt(此脚本创建的文件,具有预期输出):
foo1:bar1
foo1:bar2
foo2:bar1
foo2:bar2
//main.mjs:
从“流”导入流;
从“util”导入util;
从“readline”导入readline;
从“fs”导入fs;
从“操作系统”导入操作系统;
/**将可读流作为文本行上的异步iterable返回*/
函数lineIteratorFromFile(文件流){
返回readline.createInterface({
输入:fileStream,
crlfDelay:无穷大
})
}
(异步()=>{
等待使用
.promisify(溪流管道)(
异步函数*(){
对于wait(lineIteratorFromFile(fs.createReadStream(“./in1.txt”))的常量lineA){
用于等待(lineIteratorFromFile的常量lineB)(fs.creat