从“命名管” / fifo读取node.js

问题描述 投票:0回答:2

I启动Node.js进程,然后稍后,我写入命名的管道。由于某些原因,似乎没有数据到达ON数据回调。 我正在写信给命名的管道:

 mkfifo NAMEDPIPEIN
 echo "foo bar baz" > NAMEDPIPEIN

另一个解决方案,来自

@@richardpringle
应该起作用,但功能性限制。

如果您尝试以这种方式打开多个FIFO(超过线程池中的线程数),那么您打开的第一个线程将不再流式传输数据。这是因为
node.js linux bash macos named-pipes
2个回答
12
投票
模块不是设计用于在非阻止模式下使用文件描述符的。而是使用

net模块!

Https://stackoverflow.com/a/52622722/1843507

当前从FIFO进行流式传输的方法正在使用插座:
const fs = require('fs');
const net = require('net');

fs.open('path/to/fifo/', fs.constants.O_RDONLY | fs.constants.O_NONBLOCK, (err, fd) => {
  // Handle err
  const pipe = new net.Socket({ fd });
  // Now `pipe` is a stream that can be used for reading from the FIFO.
  pipe.on('data', (data) => {
    // process data ...
  });
});

总而言之,如果您正在运行脚本,并且不介意将线程池中的一个线程绑定,则可以使用

@RichardPringle的解决方案。否则,您绝对应该使用此解决方案。

this应该这样做:
const fs = require('fs');
const path = require('path');

const fifoPath = path.resolve(projectRoot, '/NAMEDPIPEIN')

const fifo = fs.createReadStream(fifoPath);

fifo.on('data', data => {
  // process data...
});

使用fifo.on('data', console.log)

用于测试。

3
投票

@@user5047085'如果您一次写入命名的管道,它似乎在此之后停止工作'。 如果您使用o_rdwr打开管道(不是o_rdonly),它将继续工作。


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.