【发布时间】:2016-06-04 10:37:42
【问题描述】:
我在 Heroku 上有一个 ZombieJS 节点服务器,用于从互联网上抓取数据。服务器代码从客户端的for 循环中调用。循环的每次迭代都会进行一次服务器调用,从而使僵尸刮擦。有时,服务器会因以下错误而崩溃。只有当for 循环不止一次迭代时才会发生这种情况。
如何使代码足够健壮,以处理多个同时进行的客户端调用,每个调用都有一个for 循环。
代码:
var express = require('express');
var app = express();
var Browser = require('zombie'); // tried changing var to const; no difference
var assert = require('assert');
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 browser = new Browser();
browser.userAgent = 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0';
browser.runScripts = true;
var url = "http://www.google.com/ncr";
browser.visit(url, function() {
browser.fill('q', input).pressButton('Google Search', function(){
// parsing number of results from browser object
response.writeHead(200, {'Content-Type': 'text/plain'});
response.end(numberOfSearchResults);
});
});
}
var handleXyz = function(request, response)
{
getAbc(response, request.query.input);
}
app.listen(app.get('port'), printMessage);
app.post('/xyz', handleXyz);
错误:
assert.js:86
throw new assert.AssertionError({
^
No open window with an HTML document
at Browser.field (/app/node_modules/zombie/lib/index.js:811:7)
at Browser.fill (/app/node_modules/zombie/lib/index.js:903:24)
at /app/cfv1.js:42:11
at done (/app/node_modules/zombie/lib/eventloop.js:589:9)
at timeout (/app/node_modules/zombie/lib/eventloop.js:594:33)
at Timer.listOnTimeout (timers.js:119:15)
我有一个使用 HorsemanJS/PhantomJS 的类似项目,它以类似的方式失败(我也坚持这一点!):NodeJS server can't handle multiple users
【问题讨论】:
-
我进行了快速测试,它似乎工作正常。能否添加 browser.debug() 并查看是否可以从日志中获取更多信息?
-
您是否从
for循环中反复调用它?它只是有时会失败。 -
我会把
browser.debug()放在哪里? -
我会在你实例化浏览器之后放它(即 - var browser = new Browser(); browser.debug();
-
我能够重现。我实际上是在测试加载我自己的网站而不是谷歌(出于各种原因),但实际上使用谷歌会导致错误。我猜谷歌正在返回一个不同的响应 b/c 你在短时间内发送了太多的请求。我可以在今天晚些时候仔细查看确切的问题。
标签: javascript node.js heroku assert zombie.js