- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Heroku 上有一个 ZombieJS Node 服务器,用于从互联网上抓取数据。服务器代码是从客户端的 for
循环调用的。循环的每次迭代都会进行一次服务器调用,从而产生 zombie 抓取。有时,服务器会崩溃并出现以下错误。仅当 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
最佳答案
一般来说,我认为您应该小心或避免向远程服务器生成大量未经请求的请求。许多站点会限制您和/或开始拒绝连接。话虽如此,我相信我在这个特殊案例中找到了问题的根源。
我测试了代码片段,对于这种特殊情况,如果您发出太多请求,Google 将重置连接。当连接重置时,其中一个变量最终断言失败。
重置连接时出现的错误:
zombie TypeError: read ECONNRESET
at zombie/lib/pipeline.js:89:15
at tryCatcher (zombie/node_modules/bluebird/js/release/util.js:16:23)
at Promise._settlePromiseFromHandler (zombie/node_modules/bluebird/js/release/promise.js:497:31)
at Promise._settlePromise (zombie/node_modules/bluebird/js/release/promise.js:555:18)
at Promise._settlePromise0 (zombie/node_modules/bluebird/js/release/promise.js:600:10)
at Promise._settlePromises (zombie/node_modules/bluebird/js/release/promise.js:679:18)
at Async._drainQueue (zombie/node_modules/bluebird/js/release/async.js:125:16)
at Async._drainQueues (zombie/node_modules/bluebird/js/release/async.js:135:10)
at Immediate.Async.drainQueues [as _onImmediate] (zombie/node_modules/bluebird/js/release/async.js:16:14)
at processImmediate [as _immediateCallback] (timers.js:383:17)
我进一步了解了您原来的错误,但问题的根源实际上是由于上述原因。当上述情况发生时,它会导致 document.documentElement 为 false-y 值,并随后导致 zombie/lib/index.js 中的 field 函数中的断言失败:
assert(this.document && this.document.documentElement, 'No open window with an HTML document');
我认为最简单的解决方案是在客户端处理错误并尝试正常恢复。
关于javascript - zombie JS : intermittently crashes when called repeatedly from a for loop,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35563187/
我最近开始研究使用 Zombie.js + Mocha + Node.js 作为旨在用于客户端(例如在浏览器中)的 JavaScript 文件的单元测试框架。 不过,阅读文档后,我开始怀疑 Zombi
在僵尸的 RSpec 测试中,我试图让这个测试通过 describe Zombie do it "starts off with two weapons" do z = Zombie.ne
我正在尝试解决以下挑战,但无济于事:僵尸的起始距离为米,移动速度为每秒 0.5 米。每一秒,你首先射击一个僵尸,然后剩下的僵尸又向前移动 0.5 米。 如果任何僵尸设法到达 0 米,你就会被吃掉。如果
目前,我正在为应用程序商店构建我的第一个应用程序,因此我已阅读 here ,应用程序应使用少于 30 MB 的 RAM(iPhone 3G、iPhone 4)。我读到,在某个时间点,iOS 将开始通过
我正在制作僵尸启示录风格的奶酪游戏,但我不知道在哪里/如何声明僵尸。我认为既然我在我的 Gamescene.sks 文件中制作了它们,每个名称都为“僵尸”,那么它们将被这样声明。我试图让僵尸(我在 .
工具 尝试 1 Darwin 14.3.0 Darwin 内核版本 14.3.0 io.js v1.8.1 zombie 版本 4.0.7 2015-04-10 尝试 2 Linux ubuntuG5
所以我遇到了zombie.js,这是一个 headless 浏览器吗? 如果是这样,它使用什么浏览器引擎? 我可以依靠它进行大量自动化测试吗?基本上,我仅限于单个服务器,因此我想尽可能多地进行浏览器测
使用browser.visit,我正在获取浏览器的页面,如文档中所示。根据浏览器API,browser.document返回主窗口的文档。但是,我不确定如何转储(显示)文档的内容。是否有类似brows
我在使用 Zombie.js 和评估将内容写入 window 变量的脚本时遇到了一些问题。这是一个例子来说明我的意思: 假设我有一个脚本 foo.js 执行以下操作: window.foo = 'fo
目前我正在尝试使用 zombie.js 为我的网站运行自动化测试。现在我正在努力使一个人注册自动化。对于注册,表单使用了 3 个不同的 div,如下所示 页面代码: ...
我开始使用 zombie js,但我有一些初学者问题: 1.) 如何测试ajax调用?例如我有 php ajax 操作 (Zend) public function ajaxSomeAction()
Question: How can I determine which one produces a "zombie process" // Case 1 while(fork()) ; ex
我在 EC2 上使用 spot 实例来使用 RabbitMQ 队列。每个作业都需要几秒钟,并且需要手动“确认”。 实例终止时会出现问题。没有时间完全关闭 AMQP 消费者,所以我剩下的 RabbitM
我正在尝试处理 Zombie.js 中的下载提示,查看 API我没有看到任何指示如何这样做的信息。 基本上,我要做的是浏览需要身份验证的网站,然后单击网站上的按钮(无 href),然后自动进行下载。下
我正在尝试在 Express 应用程序上使用 zombie.js(带有 mocha)以确保某些元素不会显示在页面上。以下是我尝试执行此操作的方法: var app = require('../app)
我正在尝试使用 zombie.js 提交表单,但 pressButton() 失败并显示“错误:没有按钮‘xxx’”,其中 xxx 是选择器。这是应用程序: var Browser = require
我想显式销毁一个对象(对其及其所有字段调用析构函数),但我可能仍然持有一些指向相关对象的指针。因此,我还不想释放内存;相反,我想留下一个标志“我是一个被摧毁的物体”。 我想到了以下方法: class
重启我们的 Jenkins 2.107.2 实例后,它会在主页的“master”部分显示许多之前完成的管道运行,并带有一个部分完成的进度条。 当查看这些运行的控制台日志时,它们是几天前完成的(早在重启
你知道如何使用 Zombie.js 按 Enter 键吗? 提前致谢。 最佳答案 目前还没有办法只使用 zombie API 来做到这一点。这是因为 .fire() 方法不允许您传递除事件名称之外的任
背景: 我们使用了很多聚合、单例和多例编排,类似于 Seroter's Round Robin此处描述的技术(BizTalk 2009)。 所有这些编排类型都有相当任意的退出或延续点(用于聚合),通常
我是一名优秀的程序员,十分优秀!