Как передать поток в дескриптор файла в узле? - PullRequest
1 голос
/ 08 июля 2019

Я пишу cli в узле, я хочу открыть пользователям $ EDITOR для редактирования данных, считываемых из потока (ответ HTTP IncomingMessage).

Как я могу отправить данные вдескриптор файла?

В Bash я мог бы написать это:

$EDITOR <(curl $url)

или

$DIFF <(curl $url_1) <(curl $url_2)

<(curl $url) расширяется до чего-то вроде /proc/self/fd/11

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

Но как мне написать это в javascript?

import cp from 'child_process'
const fisrt = request(...);
const second = require(...);
const first_fd = ???;
const second_fd = ???;

const proc = cp.spawn(process.env.DIFF, [first_fd, second_fd] { stdio: 'inherit' });

Хорошо, если stream поддерживается сокетом или fd, вы можете передать его в options.stdio, но что, если это не так?t, что если это поток преобразования?

options.stdio object - делится читаемым или записываемым потоком, который ссылается на tty, файл, сокет или канал, сдочерний процесс.Базовый дескриптор файла потока дублируется в дочернем процессе на fd, который соответствует индексу в массиве stdio.Поток должен иметь базовый дескриптор (файловые потоки не появляются, пока не произошло событие 'open').

Да, я могу создать временный файл, но могу ли я сделать это без него?

1 Ответ

1 голос
/ 26 июля 2019

Вы можете передавать загруженный контент в текстовый редактор vim на своем терминале с помощью следующего кода nodejs:

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();
});

Затем с вашего терминала, если вы выполните этот код, он загрузит HTML-код Google и позволит вам отредактировать и сохранить его в файл. Вы можете использовать :w myfile.txt для сохранения в файл в vim.

Дополнительная информация по этому вопросу: https://2ality.com/2018/05/child-process-streams.html

О загрузке 2 файлов:

diff <(curl $url_1) <(curl $url_2) это фактически создание 2 файловых дескрипторов (fd) и использование их в качестве аргументов для diff. Это почти то же самое, что дать 2 пути к файлам для diff

diff downloadedFile1 downloadedFile2

Вы можете использовать имена файлов, начинающиеся с точки и подчеркивания, чтобы предотвратить переопределение любого другого файла, или просто проверить, существует ли файл, а затем создать файл и использовать эти файлы в качестве аргументов. Это намного проще и чище.

Выше объяснено лучше в этом ответе как

"<(list) соединяет вывод списка с файлом в /dev/fd"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...