2015-11-20 16 views
5

Sto provando a reindirizzare i risultati grep nello script nodejs. Ho scoperto che dovrei ricevere i dati da process.stdin.Metodo sconosciuto process.openStdin()

Inoltre, ho trovato diversi modi per lavorare con stdin. Ma sono diversi e non riesco a trovare tutte le informazioni a riguardo. So quattro modi (primi 3 Iniziare con var data = ""):

1) più popolari di risultati della ricerca

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) si presenta come il primo, ma con funzione sconosciuta process.openStdin()

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

3) Nella documentazione che ho letto la chiamata allo stdin.resume() cambia in "vecchio tipo". Quindi, se non avessimo chiamato 'curriculum' - possiamo usare 'leggibile' evento

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

4) Utilizzare modulo readline. È molto utile finchè i risultati di grep sono in linee mutiple e lì non ho bisogno di dividere i dati ricevuti da solo. Ma per molto tempo non sono riuscito a capire perché tutte le informazioni siano state trasmesse direttamente allo stdout. Poi ho scoperto che possiamo passare oggetti vuoti invece di process.stdout durante la creazione dell'interfaccia e che i dati non verranno inviati in output.

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) La mia variante. Usa un altro modulo 'split': consente di leggere dallo stream e di dividere i dati in chuks tramite il simbolo specificato (\r?\n per impostazione predefinita). L'ho usato per funzionare con il socket e non appena lo stdin è anche lo streaming leggibile - possiamo usarlo qui.

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

La mia domanda è "Cosa è process.openStdin(); ????"

Ho cercato ogni pagina in google, ma non ho trovato alcuna documentazione su questa funzione!

Anche durante la ricerca ho scoperto che la documentazione ufficiale per nodejs è brutta, non menzionata da quali metodi di versione sono disponibili, nessuna descrizione dettagliata su molti oggetti/metodi, nessun commento dell'utente. E questo metodo (openStdin) esiste e funziona, ma da nessuna parte è stato descritto! WTF ???

risposta

4

Mentre scrivevo la questione che ho trovato la risposta :)

E 'in source code di nodejs:

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

Ma mi chiedo, perché non viene descritto nella documentazione? Se è una funzione solo per uso privato, perché viene usata da molte persone che hanno scritto di lavorare con stdin?

+0

Il meglio che posso dire, [è stato ritirato in 0.3.3] (https://github.com/nodejs/node/blob/43e4efdf210adb2cc3ba26518fd4588f9e0152ff/doc/changelogs/CHANGELOG_ARCHIVE.md#20110102-version-033-unstable) deve ancora esistere per la compatibilità all'indietro. – vossad01