2017-08-19 2 views
0

J'ai le code de ce noeudchild_processes multiples sont créés dans le nœud js

var bat = null; 
app.post("/api/run", function(req,res) { 
    if(!bat) { 
     bat = spawn('cmd.exe', ['/c App.exe']); 
    } 

    if(req.body.success) { 
     bat.kill(); 
    } 

    bat.stdin.write(req.body.input+'\n'); 

    bat.stdout.on('data', function (data) { 
     console.log(data.toString()); 
     res.end(JSON.stringify({data: data.toString()})); 
    }); 

    bat.stderr.on('data', function (data) { 
     console.log(data.toString()); 
    }); 

    bat.on('exit', function (code) { 
     bat = null; 
     console.log('Child exited with code ' + code); 
    });  
}); 

Ce code est supposé créer un seul processus enfant qui exécuter le fichier exe. Mais après 3 demande ajax lorsque le processus de l'enfant est de tuer c'est sortie sur la console:

Input NO: 1 You entered: input 1

Input NO: 2 You entered: input 2

Input NO: 2 You entered: input 2

Input NO: 3 You entered: input 3

Input NO: 3 You entered: input 3

Input NO: 3 You entered: input 3

Child exited with code 1
Child exited with code 1
Child exited with code 1

alors qu'il doit enregistrer chaque entrée une fois et il devrait y avoir qu'un seul processus enfant. Quel est le problème avec ce code.
Toute aide sera appréciée. Merci

Répondre

2

Vous êtes en train d'instancier un processus mais en connectant continuellement de nouveaux gestionnaires d'événements à chaque requête, ce qui explique pourquoi vous obtenez une sortie en double (3 requêtes = 3 fois le message).

Déplacez vos .on appels dans l'instruction if (!bat)

if (!bat) { 
    bat = spawn('cmd.exe', ['/c App.exe']); 
    bat.stdout.on('data', function (data) { 
     console.log(data.toString()); 
     res.end(JSON.stringify({data: data.toString()})); 
    }); 
    bat.stderr.on('data', function (data) { 
     console.log(data.toString()); 
    }); 
    bat.on('exit', function (code) { 
     bat = null; 
     console.log('Child exited with code ' + code); 
    }); 
} 
bat.stdin.write(req.body.input+'\n'); 
+0

merci beaucoup. vous avez sauvé ma journée –

+0

@SaadMehmood pas tous les héros ware capes – James

1

Il n'y a qu'un seul processus enfant en fait, mais chaque demande ajoutera un écouteur d'événement exit pour le processus de l'enfant. Ainsi, la deuxième fois, l'entrée s'affiche deux fois et la troisième fois trois fois. Et afficher Child exited 3 fois.

Vous pouvez essayer les méthodes suivantes.

    écouteur d'événement
  • add au moment du processus enfant créé
  • supprimer l'auditeur après la réponse envoyée
  • utilisation once pour définir un auditeur une seule fois pour les événements

Hope this peut aider vous