Saya memiliki kode js simpul ini

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);
    });    
});

Kode ini seharusnya membuat hanya satu proses anak yang akan menjalankan file exe. Tetapi setelah 3 permintaan ajax ketika proses anak dimatikan, ini adalah output di konsol:

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

Sementara itu harus mencatat setiap input satu kali dan seharusnya hanya ada satu proses anak. Apa yang salah dengan kode ini.
Bantuan apa pun akan dihargai. Terima kasih

0
Saad Mehmood 19 Agustus 2017, 11:14

2 jawaban

Jawaban Terbaik

Anda hanya membuat satu proses tetapi Anda terus-menerus menghubungkan event handler baru pada setiap permintaan itulah sebabnya Anda mendapatkan output duplikat (3 permintaan = 3x pesan).

Pindahkan panggilan .on Anda ke dalam pernyataan 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'); 
2
James 19 Agustus 2017, 08:43

Sebenarnya hanya ada satu proses anak, tetapi setiap permintaan akan menambahkan pendengar acara exit untuk proses anak. Jadi input yang kedua kali ditampilkan dua kali dan yang ketiga kali ditampilkan 3 kali. Dan tampilkan Child exited 3 kali.

Anda bisa mencoba cara-cara berikut.

  • tambahkan pendengar acara pada saat proses anak dibuat
  • hapus pendengar setelah respons terkirim
  • gunakan once untuk menyetel pendengar satu kali untuk acara tersebut

Semoga ini bisa membantu Anda

1
WangJie 19 Agustus 2017, 08:45