2016-02-10 61 views
3

我有一個在Heroku上運行的NodeJS服務器(免費版)。服務器接受來自客戶端的HTTP POST(傳遞參數)並在無頭瀏覽器中執行Web請求(使用參數)。無頭瀏覽器被稱爲HorsemanJS。 「Horseman是一個使用PhantomJS的Node.js模塊,它具有直觀的可鏈接API,可理解的控制流,支持多個標籤以及內置jQuery。」NodeJS服務器無法處理多個用戶

當我從客戶端(我的計算機)向服務器發送請求(實際上for循環的20個請求)到服務器時,服務器代碼正常工作(20個HorsemanJS Web請求)並返回期望值。然後,它等待下一個連接。這很好。

問題是,當我嘗試用兩個不同的客戶端(我的電腦和手機)同時連接到服務器時,它崩潰了。我可以重新啓動服務器併成功返回到使用一個客戶端。我怎樣才能讓它處理多個客戶?墜毀時

錯誤:從我的服務器代碼

child_process.js:788 
child.stdout.addListener('data', function(chunk) { 
      ^ 
TypeError: Cannot read property 'addListener' of undefined 
    at Object.exports.execFile (child_process.js:788:15) 
    at exports.exec (child_process.js:649:18) 
    at Socket.<anonymous> (/app/node_modules/node-horseman/node_modules/node-phantom-simple/node-phantom-simple.js:237:7) 
    at Socket.g (events.js:199:16) 
    at Socket.emit (events.js:107:17) 
    at readableAddChunk (_stream_readable.js:163:16) 
    at Socket.Readable.push (_stream_readable.js:126:10) 
    at Pipe.onread (net.js:538:20) 

提取物:

var express = require('express'); 
var app = express(); 
var Horseman = require('node-horseman'); 

app.set('port', (process.env.PORT || 5000)); 

var printMessage = function() { console.log("Node app running on " + app.get('port')); }; 

var getAbc = function(response, input) 
{ 
    var horseman = new Horseman(); 

    horseman 
     .userAgent("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0") // building web browser 
     .open('http://www.stackoverflow.com')       
     .html()          
     .then(function (result) { 
      var toReturn = ijk(result)); 

      response.writeHead(200, {'Content-Type': 'text/plain'}); 
      response.end(toReturn); 
     }).close(); 
} 

var handleXyz = function(request, response) 
{ 
    getAbc(response, request.query.input); 
} 

app.listen(app.get('port'), printMessage); 
app.post('/xyz', handleXyz); 

我試圖移動.close.then,也是前.then。該代碼仍然適用於單個客戶端,但不是多個。

我懷疑問題是一個客戶端在客戶端嘗試使用它之前/關閉一個PhantomJS實例。

+0

我在使用ZombieJS時也遇到類似問題:http://stackoverflow.com/questions/35563187/zombiejs-intermittently-crashes-when-called-repeatedly-from-a-for-loop – user3320795

回答

0

把最後的horseman.close()放在最後可能沒有足夠的時間來完全關閉我們的phantomJS過程。嘗試將finally改爲.then(),然後返回horseman.close()。

+0

試過這個。它適用於單個客戶端,但適用於多個客戶端的問題。 – user3320795