2012-02-10 17 views
17

Tengo un script/servidor node.js que lee alguna entrada de stdin cuando se inicia. Sin embargo, a veces no hay datos para pasar. Esto es problemático porque parece que en este caso no se invocan los eventos data ni end. ¿Cómo puedo detectar cuando este es el caso en el código node.js?node.js: ¿Cómo detectar una secuencia stdin vacía?

Me gustaría evitar tener que agregar caracteres especiales "finales" al final de la entrada, para no molestar al cliente. El código asociado es a continuación:

var newHTML = ''; 
    var gfm = spawn(__dirname + '/node_modules/docter/bin/github-flavored-markdown.rb'); 
    process.stdin.on('data', function(chunk){ 
    gfm.stdin.write(chunk); 
    }); 
    process.stdin.on('end', function(){ 
    gfm.stdin.end(); 
    }); 
    gfm.stdout.on('data', function(data) { 
    newHTML += data; 
    }); 
    gfm.on('exit',function(ecode){ 
    socket.emit('newContent', newHTML); 
    }); 
    process.stdin.resume(); 
+1

Ha intentado process.stdin.on ('error', function() {})? – Marshall

+0

o gfm.stdout.on ('error', function() {}) – Marshall

+0

encontró una solución? eso parece imposible. – antitoxic

Respuesta

3

Un vacío o no corriente STDIN es detectado por el end evento desde process.stdin.

Este sencillo script stdin.js demuestra que:

process.stdin.on('data', function(data) { console.log(data) }); 
process.stdin.on('end', function() { console.log('EOF') }); 

diferentes escenarios:

$ echo test | node stdin.js 
<Buffer 74 65 73 74 0a> 
EOF 
$ echo -n | node stdin.js 
EOF 
$ node stdin.js < /dev/null 
EOF 
$ 

este script pipe.js demuestra que el uso de tubería a un proceso hijo engendrado funciona muy bien:

var spawn = require('child_process').spawn; 
var cat = spawn('/bin/cat'); 
cat.stdout.on('data', function(data) { console.log(data) }); 
cat.stdout.on('end', function() { console.log('EOF') }); 

process.stdin.pipe(cat.stdin); 

Como se esperaba:

$ echo test | node pipe.js 
<Buffer 74 65 73 74 0a> 
EOF 
$ echo -n | node pipe.js 
EOF 
$ node pipe.js < /dev/null 
EOF 
$ 
4

Creo que lo que puede estar sucediendo es que no le está dando ningún vapor de agua.

ejemplo Øystein Steimler muestra que la alimentación /dev/null en su aplicación:

pipe.js nodo </dev/null

Sin embargo, nunca se dirigió cuando no transmitir stdin a la aplicación en absoluto. Simplemente ejecutando node pipe.js no saldrá porque aún está esperando stdin.

Puede probar esto por sí mismo con otros programas UNIX, por ejemplo cat

Intente ejecutar esto:

cat < /dev/null 

Ahora trata simplemente ejecutando:

cat 

Es no sale porque está esperando stdin. Puede escribir en la terminal y enviar al programa presionando enter. Todavía no salir (y esperar más de entrada) hasta que recibe la EOF que se puede ver con ctrl + d

+2

¿Cómo puedo detectar cuándo ocurre esto? No recibo ningún evento 'readline'' close' o 'process.stdin'' end'. – spiffytech

1

algo que puede hacer es hacer que su aplicación acepta un argumento como -s cuales lo hace leer de stdin.

Eso es lo que hace la herramienta CLI de LiveScript:

-s, --stdin read stdin

Cuestiones relacionadas