2015-10-29 11 views
28

से डेटा सेट मैं, नोड आवेदन जो करने के लिए और आवेदन अंडे किया (बच्चे प्रक्रिया) है आवेदन मेजबान और पोर्ट:नोड js प्राप्त और अलग प्रक्रिया

var exec = require('child_process').spawn; 
var child = exec('start app'); 
console.log("Child Proc ID " + child.pid) 
child.stdout.on('data', function(data) { 
    console.log('stdout: ' + data); 
}); 
child.stderr.on('data', function(data) { 
    console.log('stdout: ' + data); 
}); 
child.on('close', function(code) { 
    console.log('closing code: ' + code); 
}); 

कुछ आवेदन तुरंत शुरू कर देंगे और कुछ आवेदन समय 10-20 सेकंड तक ले जाएगा जब तक कि वे शुरू नहीं करते हैं।

अब मैं ऐप चलाने के लिए नोड http प्रॉक्सी का उपयोग करता हूं और समस्या यह है कि जब मैं इसे चलाने और चलाने से पहले ऐप को चलाने के लिए त्रुटि प्राप्त कर रहा हूं तो मुझे त्रुटि मिल रही है। कोई विचार है कि मैं इस मुद्दे को कैसे हल कर सकता हूं?

proxy.on('error', function (err, req, res) { 
    res.end('Cannot run app'); 
}); 

बीटीडब्ल्यू, मैं हमारे ढांचे की सीमा के कारण प्रॉक्सी त्रुटि में प्रतिक्रिया 500 नहीं भेज सकता। किसी भी अन्य विचार कैसे मैं कुछ समय समाप्ति के साथ हो सकता है आवेदन को ट्रैक कर सकते मौसम देखने के लिए यह प्रतिक्रिया भेज 200

अद्यतन - मेरे तर्क का नमूना

httpProxy = require('http-proxy'); 
var proxy = httpProxy.createProxyServer({}); 
http.createServer(function (req, res) { 
    console.log("App proxy new port is: " + 5000) 
    res.end("Request received on " + 5000); 
}).listen(5000); 

function proxyRequest(req, res) { 
    var hostname = req.headers.host.split(":")[0]; 
    proxy.web(req, res, { 
     target: 'http://' + hostname + ':' + 5000 
    }); 

    proxy.on('error', function (err, req, res) { 
     res.end('Cannot run app'); 
    }); 
} 
+0

आप उल्लेख करते हैं कि आपके पास ढांचे की सीमाएं हैं - क्या आप अधिक विस्तार से जा सकते हैं? यह जानना मुश्किल है कि आपको किस प्रकार के समाधान उपलब्ध हैं यदि हम नहीं जानते कि हम क्या कर सकते हैं और नहीं कर सकते हैं।क्या आपके पास बाल प्रक्रिया (एसएस) पर नियंत्रण है जो पैदा हो रहा है? –

+0

यदि कोई अनुरोध भेजा गया है और ऐप अभी तक उपलब्ध नहीं है तो आप क्या होने की उम्मीद करते हैं? – Koder

उत्तर

1

आपको क्या करना होगा पहली प्रतिक्रिया के लिए सुनने के लिए है अपने प्रॉक्सी और यह निर्धारित करने के लिए कि आपका ऐप सफलतापूर्वक शुरू हुआ या नहीं, इसके स्टेटस कोड को देखें। यहां बताया गया है कि आप यह कैसे करते हैं:

proxy.on('proxyRes', function (proxyRes, req, res) { 
    // Your target app is definitely up and running now because it just sent a response; 
    // Use the status code now to determine whether the app started successfully or not 
    var status = res.statusCode; 
}); 

आशा है कि इससे मदद मिलती है।

+0

धन्यवाद लेकिन मुझे कब और कैसे करना चाहिए? मान लें कि मैंने अपना कोड डाला है और उपयोगकर्ता उस ऐप को चलाने के लिए ब्राउज़र पर क्लिक करता है जो अभी भी ऊपर नहीं है, इसलिए पहली बात यह है कि उसे त्रुटि दिखाई देगी, तो मैं इसे कैसे दूर कर सकता हूं? शायद आप इस विषय में एक विशेषज्ञ हैं और मुझे यहां कुछ याद आती है :) धन्यवाद! –

+0

तो यदि उपयोगकर्ता ब्राउज़र खोलता है और ब्राउज़र आपके ऐप का अनुरोध करता है, तो प्रॉक्सी को 'proxyRes' ईवेंट को उत्सर्जित करना चाहिए। यदि आपका ऐप तैयार नहीं है, तो ब्राउज़र तब तक प्रतिक्रिया प्राप्त नहीं करेगा जब तक कि यह न हो। तो मुझे लगता है कि यह काम करना चाहिए। – idancali

+0

धन्यवाद लेकिन त्रुटि पहले नहीं आएगी? –

1

सुनिश्चित नहीं है कि यह समझ में आता है, तो आपके मुख्य ऐप में अनुभव एक HTML पृष्ठ से शुरू होना चाहिए और प्रत्येक बच्चे की प्रक्रिया में स्वयं लोडर होना चाहिए।

तो मूल रूप से, आपको एक http हैंडलर की आवश्यकता होती है, जो कि बच्चे की प्रक्रिया तैयार होने तक अनुरोध को पूरा करती है। तो बस एचटीएमएल से एजेक्स कॉल करें, और सर्विस तैयार होने तक एनीमेशन लोडिंग दिखाएं।

//Ajax call for each process and update the UI accordingly 
$.get('/services/status/100').then(function(resp) { 
    $('#service-100').html(resp.responseText); 
}) 

//server side code (express syntax) 
app.get('/services/status/:id ', function(req,res) { 
    // Check if service is ready 
    serviceManager.isReady(req.params.id, function(err, serviceStats) { 
     if(err) { 
      //do logic err here , maybe notify the ui if an error occurred 
      res.send(err); 
      return; 
     } 
     // notify the ui , that the service is ready to run , and hide loader 
     res.send(serviceStats); 
    }); 
}) 
1

मुझे यकीन है कि मैं सही ढंग से सवाल समझ में नहीं हूँ, लेकिन आप एक बच्चे की प्रक्रिया अनुरोध पर स्पिन के लिए इंतजार करना चाहते हैं और आप इस अनुरोध को इस बच्चे की प्रक्रिया के लिए प्रतीक्षा करने के लिए और फिर इसे करने के लिए भेज होना चाहते हैं? बच्चे प्रक्रिया शुरू कर दी गई है और जब हैं कि इतने है एक सरल उपाय) इस

var count = 0;//Counter to check 
    var maxDelay = 45;//In Seconds 
    var checkEverySeconds = 1;//In seconds 
    async.whilst(
     function() { 
      return count < maxDelay; 
     }, 
     function (callback) { 
      count++; 
      self.getAppStatus(apiKey, function (err, status) { 
       if (status != 200) { 
        return setTimeout(callback, checkEverySeconds * 1000); 

       } 
       continueWithRequest(); 

      }); 
     }, 
     function (err) { 
      if (err) { 
       return continueWithRequest(new Error('process cannot spin!')); 
      } 
     } 
    ); 

समारोह continueWithRequest (की तरह कुछ का उपयोग करने के बच्चे की प्रक्रिया के लिए अनुरोध आगे भेज देंगे हो जाएगा और getAppStatus 200 वापस आ जाएगी कुछ अन्य कोड जब यह नहीं है। सामान्य विचार यह है कि यदि प्रक्रिया चल रही है और 45 सेकंड के बाद यदि यह नहीं होगा तो यह हर सेकेंड की जांच करेगा। प्रतीक्षा समय और अंतराल की जांच आसानी से समायोजित किया जा सकता है। यह थोड़ा कच्चा है, लेकिन अनुरोध में देरी के लिए काम करेगा और सेटटाइमआउट एक नया ढेर शुरू करेगा और ब्लॉक नहीं करेगा। उम्मीद है की यह मदद करेगा।

1

यदि आप जानते हैं (लगभग) कितना समय एप्लिकेशन चल ऊपर और पाने के लिए लेता, बस जोड़ें setTimeout(proxyRequest, <Time it takes the app to start in MS>)

(वहाँ सबसे अधिक संभावना अधिक स्मार्ट/जटिल समाधान कर रहे हैं, लेकिन यह एक सबसे आसान है।)

1

इवेंट-एमिटर या मैसेंजर का उपयोग क्यों नहीं करें?

var eventEmitter = require('event-emitter') 
var childStart = require('./someChildProcess').start() 

if (childStart !== true) { 
     eventEmitter.emit('progNotRun', { 
      data: data 
     }) 
} 

function proxyRequest(req, res) { 

    var hostname = req.headers.host.split(":")[0]; 
    proxy.web(req, res, { 
     target: 'http://' + hostname + ':' + 5000 
    }); 

    eventEmitter.on('progNotRun', function(data) { 
     res.end('Cannot run app', data); 
    }) 
} 
संबंधित मुद्दे