2017-07-03 4 views
3

Je pense que ce serait simple, mais ce qui suit ne fonctionne pas comme prévu.Node.js passe le texte en tant que stdin de `spawnSync`

Je veux acheminer des données vers un processus, disons (juste une commande arbitraire pour l'illustration) wc, depuis le nœud.

Le docs et d'autres SO questions semblent indiquer que le passage d'un flux devrait fonctionner:

const {spawnSync} = require('child_process') 
const {Readable} = require('stream') 

const textStream = new Readable() 
textStream.push("one two three") 
textStream.push(null) 

const stdio = [textStream, process.stdout, process.stderr] 
spawnSync('wc', ["-c"], { stdio }) 

Malheureusement cela jette une erreur:

The value "Readable { ... } is invalid for option "stdio"

Le relevant bit of code from internal/child_process.js ne révèle pas quelles sont les options valides prévues sont.

+0

C'est assez intriguant! J'ai seulement réussi à le faire fonctionner en passant directement des données à l'option 'input' au lieu de réaffecter' stdin'. –

+0

_ "Notez que le flux doit avoir un descripteur sous-jacent" _. Je ne pense pas que votre 'textStream' en ait un. – robertklep

+0

Merci @robertklep - Je l'ai noté aussi; De tout ce que j'ai lu, il n'est pas clair pourquoi un descripteur est nécessaire, comment il est implémenté/différencié d'un flux régulier, ou en tout cas comment on travaille autour de lui. C'est une exigence étrange et apparemment arbitraire. –

Répondre

3

Pour présenter des données particulières comme stdin données pour le processus de l'enfant, vous pouvez utiliser l'option input:

spawnSync('wc', ['-c'], { input : 'one two three' })