如何将流传输到节点中的文件描述符?

时间:2019-07-08 04:55:56

标签: node.js posix file-descriptor

我正在编写一个cli in节点,我想打开用户$ EDITOR来编辑从流(http响应IncomingMessage)中读取的数据。

如何将数据发送到文件描述符?

在bash中,我可以这样写:

$EDITOR <(curl $url)

<(curl $url)扩展为类似/proc/self/fd/11

echo <(curl $url)
/proc/self/fd/11

但是我怎么用javascript编写呢?

import cp from 'child_process'
const stream = request(...);
const fd = ???;
const proc = cp.spawn(process.env.EDITOR, [fd] { stdio: 'inherit' });

好吧,如果stream由套接字或fd支持,则可以将其传递给options.stdio,但是如果不是,怎么办呢,如果它是转换流呢?

  

options.stdio    对象-与子进程共享一个引用tty,文件,套接字或管道的可读或可写流。流的基础文件描述符在子进程中复制到与stdio数组中的索引对应的fd中。该流必须具有基础描述符(文件流只有在'open'事件发生之前才可以)。

是的,我可以创建一个临时文件,但没有一个可以做吗?

1 个答案:

答案 0 :(得分:1)

您可以使用以下nodejs代码将下载的内容流式传输到终端的vim文本编辑器中:

const { spawn } = require('child_process');
const request = require('request');
// 
request({
    url: 'https://google.com' 
}, function (err, res, body) { 
    const vi = spawn('vi', ['-'], { stdio: ['pipe', process.stdout, process.stderr] });

    vi.stdin.write(body);
    vi.stdin.end();
});

然后,如果您执行此代码,则从您的终端上,它将下载google的html,并让您对其进行编辑并将其保存在文件中。您可以使用:w myfile.txt将文件保存到vim中。

有关此问题的进一步阅读:https://2ality.com/2018/05/child-process-streams.html

关于下载2个文件:

diff <(curl $url_1) <(curl $url_2)实际上是在创建2个文件描述符(fd),并将它们用作diff的参数。这几乎与为diff提供2个文件路径

diff downloadedFile1 downloadedFile2

您可以使用以点和下划线开头的文件名来防止覆盖任何其他文件,或者仅检查文件是否存在,然后创建文件并将这些文件用作参数。这样更简单,更清洁。

this answer中,上述解释为

“ {<(list)将列表的输出与/dev/fd中的文件连接起来