我有一个在Heroku上运行的NodeJS服务器(免费版)。服务器从客户端接受HTTP POST(传递参数)并在无头浏览器中执行Web请求(使用参数)。无头浏览器称为HorsemanJS。 " Horseman是一个Node.js模块,它使PhantomJS成为一种乐趣。它具有直接可链接的API,可理解的控制流,支持多个选项卡,以及内置的jQuery。"
当我从客户端(我的计算机)向服务器发送请求(实际上是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 :(得分:0)
将horseman.close()放在finally中可能不会给它足够的时间来完全关闭我们的phantomJS进程。尝试将finally更改为.then(),并返回horseman.close()。