2017-05-03 2 views
0

J'essaie d'utiliser les fonctions spawn/exec du module child_process. Mais je remarque une étrange différence entre ce que je vois dans un vrai terminal et sur la ligne de commande. Voici un exemple:nœud child_process n'écrit pas tout sur stdout

Terminal:

$ redis-cli 
127.0.0.1:6379> hmset hash name Jack age 33 
OK 
127.0.0.1:6379> hscan hash 0 
1) "0" 
2) 1) "name" 
    2) "Jack" 
    3) "age" 
    4) "33" 

En Node.js:

const child = exec("redis-cli"); 
child.stdin.setDefaultEncoding("utf-8"); 
child.stdout.on("data", data => console.log(data.toString())); 

child.stdin.write("hmset hash name Jack age 33\n"); // same as first command from cli example 

await new Promise(r => setTimeout(r, 1000)); 

child.stdin.write("hscan hash 0\n"); // same as second command from cli example 

await new Promise(r => setTimeout(r, 1000)); 

C'est ce qui est écrit à la console:

OK 

0 
name 
Jack 
age 
33 

Dans ce cas, les numéros 1), 2) etc. sont manquants. Des idées comment je peux persuader child_process de les écrire aussi à la console? Je suppose que cet exemple particulier est une bizarrerie de la façon dont redis-cli est mis en œuvre, mais les données doivent aller certains où.

Les appels await new Promise(...) sont juste pour s'assurer que la commande précédente est terminée pour cet exemple simple.

Répondre

0

Comme c'est souvent le cas, j'ai compris cela dans la minute qui suit la publication de la question.

redis-cli essaie de détecter si la sortie standard est un terminal. Ce problème est résolu en utilisant

const child = exec("redis-cli --no-raw"); 

au lieu de

const child = exec("redis-cli"); 

RTFM.