Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/38.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 如何将字符串数据以块而不是块的形式写入流_Javascript_Node.js_Io_Ipc - Fatal编程技术网

Javascript 如何将字符串数据以块而不是块的形式写入流

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', () =>

我有一个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', () => {
  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);
});