дочерний процесс вызов вилки многократно в nodejs - PullRequest
0 голосов
/ 24 февраля 2020

Я немного запутался, почему соединение запускается несколько раз. давайте сначала начнем с моего кода

main. js

  let Tokens = {};
  app.getOauthToken = async function (host, port, oauthcall = false) {
    if (host !== undefined && port !== undefined) {
       const key = host + ":" + port;
       if (Tokens[key] !== undefined) {
       if(oauthcall){
            console.log("already auth token present (mainjs)")
            await Tokens[key].getAccessToken(false);
            child.send( Tokens[key] )
      }
         return Tokens[key];
    } else {
      Tokens[key] = new Token(host, port);
     if (oauthcall) {
        await  Tokens[key].getAccessToken(false);
        console.log( " auth token in mainjs ------->", Tokens[key].token)
         child.send( Tokens[key] )       
      } 
      return Tokens[key];  
    }
  }
 }
 child.on('message', (m) => {
    console.log(" mess from child ")
    if (m && m.auth) { 
       app.getOauthToken(m.host, m.port, m.oauthcall);
    }
 });

у ребенка. js

    process.send({ "auth": true, "host": url.host, "port": url.port, "oauthcall": true });
   process.on('message', (m) => {
         console.log("msg from parent ------------>", m )
    });

вывод с 1-й попытки (fre sh начало основного. js)

     mess from child 

     auth token in mainjs -------> { "token" :dsadaq21}  
     msg from parent ------------> { "token" :dsadaq21} 

вывод во 2-й попытке (получено сообщение в дочернем. js 2 раза на process.on "message")

     mess from child 

     already auth token present (mainjs)
     msg from parent ------------> { "token" :dsadaq21} 

     already auth token present (mainjs)
     msg from parent ------------> { "token" :dsadaq21} 

выход в 3-й попытке (получил сообщение в потомке. js 3 раза на process.on "message")

     mess from child 

     already auth token present (mainjs)
     msg from parent ------------> { "token" :dsadaq21} 

     already auth token present (mainjs)
     msg from parent ------------> { "token" :dsadaq21} 

     already auth token present (mainjs)
     msg from parent ------------> { "token" :dsadaq21} 

может кто-нибудь сказать мне, это ожидаемое поведение, или я делаю что-то не так или его ошибка в nodejs примечание: - я не использовал метод "close", это проблема из-за отсутствия использования close

1 Ответ

0 голосов
/ 24 февраля 2020

Вы не показываете его, но загружаете его каждый раз, когда отправляете сообщение:

   process.send({ "auth": true, "host": url.host, "port": url.port, "oauthcall": true });
   process.on('message', (m) => {
         console.log("msg from parent ------------>", m )
    });

Однако вы активируете, что process.send также добавляет еще одного process.on прослушивателя событий.

Если вам нужно поместить это process.on в область, отличную от process.send, чтобы process.on вызывался только один раз, и process.send можно вызывать без выполнения process.on.

Это ясно?

Например:


function startTestLoop() {
 // Set up listener - this must only ever be executed _once_
 // `process.on()` adds _another_ listener callback every time it is run.
 process.on('message', (m) => {
   // This code is the callback. It runs every time the event is fired.
   console.log("msg from parent ------------>", m )
 });

 // Send message every 10 seconds - do this till the cows come home
 const handle = setInterval(() =>  
   process.send({ "auth": true, "host": url.host, "port": url.port, "oauthcall": true }), 
   10 * 1000
  )
}
...