2015-11-20 2 views
5

Я пытаюсь передать результаты grep в скрипт nodejs. Я обнаружил, что должен получать данные от process.stdin.Неизвестный метод process.openStdin()

Также я нашел несколько способов работы с stdin. Но они разные, и я не могу найти всю информацию об этом. Я знаю четыре способа (первые три запуска с var data = ""):

1) Самые популярные в результатах поиска

process.stdin.resume(); 
process.stdin.setEncoding('utf8'); 
process.stdin.on('data', function(chunk) { data += chunk; }); 
process.stdin.on('end', function() { console.log('data: ' + data); }); 

2) Похоже на первый, но с неизвестной функцией process.openStdin()

var stdin = process.openStdin(); 
stdin.on('data', function(chunk) { data += chunk; }); 
stdin.on('end', function() { console.log('data: ' + data); }); 

3) В документации, которую я прочитал, вызов stdin.resume() изменяет stdin на «старый тип». Поэтому, если мы не вызвали «возобновление», мы можем использовать «читаемое» событие

process.stdin.setEncoding('utf8'); 
process.stdin.on('readable', function() { data += process.stdin.read(); }); 
process.stdin.on('end', function() { console.log('data: ' + data); }); 

4) Используйте модуль readline. Это очень полезно, если результаты grep находятся в нескольких строках, и мне не нужно разделить полученные данные самостоятельно. Но в течение долгого времени я не мог понять, почему вся информация передается напрямую на stdout. Тогда я обнаружил, что мы можем передать пустой объект вместо process.stdout, создавая интерфейс, и данные не будут выводиться на канал.

var readline = require('readline'), 
//rl = readline.createInterface(process.stdin, process.stdout); 
rl = readline.createInterface(process.stdin, {}); 
rl.on('line', function(data) { console.log('line: ' + data); }); 

5) Мой собственный вариант. Используйте другой раздел «split» - он позволяет читать из потока и делить данные на chuks по указанному символу (\r?\n по умолчанию). Я использовал его для работы с сокетом, и как только stdin также доступен для чтения, мы можем использовать его здесь.

var split = require('split'); 
process.stdin.setEncoding('utf8'); 
process.stdin.pipe(split()).on('data', function(data) { console.log('line: ' + data); }); 

Мой вопрос "Что такое process.openStdin(); ????"

Я искал каждую страницу в google, но не нашел никакой документации по этой функции!

Также во время поиска я обнаружил, что официальная документация для nodejs уродлива - не упоминается, поскольку какие методы версии доступны, нет подробного описания многих объектов/методов, нет комментариев пользователей. И этот метод (openStdin) - существует и работает, но нигде не описывается! WTF ???

ответ

4

При написании вопрос, который я нашел ответ :)

Он находится в source code из nodejs:

process.openStdin = function() { 
    process.stdin.resume(); 
    return process.stdin; 
}; 

Но я удивляюсь, почему она не описана в документации? Если это функция только для частного использования, почему она используется многими людьми, которые писали о работе с stdin?

+0

Лучшее, что я могу сказать, [он осуждался назад в 0.3.3] (https://github.com/nodejs/node/blob/43e4efdf210adb2cc3ba26518fd4588f9e0152ff/doc/changelogs/CHANGELOG_ARCHIVE.md#20110102-version-033-unstable) должны существовать для обратной совместимости. – vossad01

Смежные вопросы