Javascript 如何将字符串数据以块而不是块的形式写入流
我有一个node.js脚本,它必须在STDIN上接受utf8数据,并在STDOUT上输出其他utf8数据 其目的是通过壳管从磁带测试框架运行器接收一个或多个TAP串,并对其进行轻微修改:Javascript 如何将字符串数据以块而不是块的形式写入流,javascript,node.js,io,ipc,Javascript,Node.js,Io,Ipc,我有一个node.js脚本,它必须在STDIN上接受utf8数据,并在STDOUT上输出其他utf8数据 其目的是通过壳管从磁带测试框架运行器接收一个或多个TAP串,并对其进行轻微修改: #!/usr/bin/env node 'use strict'; process.stdin.setDefaultEncoding('utf8'); process.stdout.setDefaultEncoding('utf8'); process.stdin.on('readable', () =>
#!/usr/bin/env node
'use strict';
process.stdin.setDefaultEncoding('utf8');
process.stdout.setDefaultEncoding('utf8');
process.stdin.on('readable', () => {
let chunk;
while ((chunk = process.stdin.read()) !== null) {
process.stdout.write('chunk: ' + chunk);
}
});
process.stdin.on('end', () => {
process.stdout.write('end\n');
});
当我使用磁带测试运行它时,npm run test unit test/unit/main.test.js |/format.js
你可以看到,数据,有点,被写了8次,分为8块
我的问题是,如何在测试中模拟这种行为?
在测试中,我使用spawn('./format.js')
生成了另一个进程,但是我如何才能写入该进程的STDIN,以便读取与tap reporter相同的数据需要8次
我将原始的tap输出(不带“chunk”标记)拆分为一个字符串数组(相当于实时输出中的chunk),并尝试在对spawned.stdin的单独写入调用中写入每个字符串,然后测试format.js
的输出:
let spawned = spawn('./format.js');
let chunksOriginal = [
// chunks here
];
spawned.stdout.on('readable', () => {
console.log(spawned.stdout.read());
});
chunksOriginal.forEach((chunk, i) => {
spawned.stdin.write(chunk);
});
我期望console.log
输出与实时输出相同的字符串,或者至少是它的第一个块,但我得到了:
chunk:
> dummy@0.0.0 test-unit /path/dummy/zzz
> tape "test/unit/main.test.js"
TAP version 13
# test 1
# comment 1
ok 1 should be equal
1..1
# tests 1
# pass 1
# ok
end
您可以看到,format.js
只读取了一次数据,上面有一个块标记。在write调用之前,我尝试在forEach循环中发出“readable”事件,这也没有帮助:
chunksOriginal.forEach((chunk, i) => {
spawned.stdin.emit('readable');
spawned.stdin.write(chunk);
});
我怀疑问题在于我不理解node.js和bash中IPC的概念。“实时输出”中的数据可能是通过所谓的node.js缓冲区写入的
我并不是在要求这个问题的确切解决方案,尽管如果有人提供,我会非常感激
只是在概念层面上的一个提示,我应该看哪里,在什么文档中,来解决这个问题将是合适的此外,我尝试使用
设置超时
,使写入过程异步,虽然我忘了在问题中提到这一点,但也没有帮助:
chunksOriginal.forEach((chunk, i) => {
setTimeout(() => {
spawned.stdin.emit('readable');
spawned.stdin.write(chunk);
}, i);
});
然后我又试了一次,增加了延迟
I*100
ms,它成功了:
chunksOriginal.forEach((chunk, i) => {
setTimeout(() => {
spawned.stdin.write(chunk);
}, i * 100);
});
这很有帮助,现在format.js
从虚拟输入接收的数据块数量与从实时输入接收的数据块数量相同(尽管可能需要一些调优、配置创建)
另外值得注意的是,emit调用是不必要的
chunksOriginal.forEach((chunk, i) => {
setTimeout(() => {
spawned.stdin.write(chunk);
}, i * 100);
});