node.js - Heroku 上的 Nightmare.JS 导致超时

标签 node.js heroku nightmare

我正在构建一个网站,当人们在 URL 的请求部分输入网站凭据时,该网站会将他们登录到该网站并发回有关其帐户的数据。在本地测试此代码不会产生任何错误,并且发生得相当快。我不确定是什么导致它在服务器上超时,而不是在本地超时。

这是来自 heroku 日志 的日志文件

2016-05-27T05:03:02.884921+00:00 heroku[slug-compiler]: Slug compilation finished
2016-05-27T05:03:02.884910+00:00 heroku[slug-compiler]: Slug compilation started
2016-05-27T05:03:02.853598+00:00 heroku[web.1]: Restarting
2016-05-27T05:03:02.854287+00:00 heroku[web.1]: State changed from up to starting
2016-05-27T05:03:05.766040+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2016-05-27T05:03:08.021294+00:00 heroku[web.1]: Starting process with command `node server.js`
2016-05-27T05:03:10.308664+00:00 app[web.1]: Node app is running on port 54574
2016-05-27T05:03:11.710569+00:00 heroku[web.1]: State changed from starting to up
2016-05-27T05:03:12.491140+00:00 app[web.1]: Fri, 27 May 2016 05:03:12 GMT express deprecated req.param(name): Use req.params, req.body, or req.query instead at server.js:16:21
2016-05-27T05:03:12.490421+00:00 app[web.1]: Fri, 27 May 2016 05:03:12 GMT express deprecated req.param(name): Use req.params, req.body, or req.query instead at server.js:15:21
2016-05-27T05:03:28.689866+00:00 heroku[web.1]: Stopping all processes with SIGTERM
2016-05-27T05:03:30.932497+00:00 heroku[web.1]: Process exited with status 143
2016-05-27T05:03:42.447506+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=GET path="/getGrades?username=REDACTED&password= REDACTED" host=fantasyps.herokuapp.com request_id=e3cb4c15-09af-432c-beb7-e815784c162e fwd="69.122.17.44" dyno=web.1 connect=1ms service=30001ms status=503 bytes=0

配置文件包含运行此文件的命令

var express = require('express');
var app = express();

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

app.use(express.static(__dirname + '/public'));

//routes go here
app.get('/getGrades', function(req, res) {
    function handleData(error, data) {
        if (error) console.log(error);
        else res.send(data);
    }
    var scrape = require('./scrape.js');
    var username = req.param('username');
    var password = req.param('password');
    scrape.scrape(username, password, handleData);
});

app.get('/', function(req, res) {
    res.send('test');
});

// start the server
app.listen(app.get('port'), function() {
  console.log('Node app is running on port', app.get('port'));
});

这是scrape.js

var Nightmare = require('nightmare');
var vo = require('vo');
exports.scrape = vo(function*(username, password) {
    var nightmare = Nightmare({show: false});
    var info = yield nightmare
        .goto('http://ps01.bergen.org') // Go To Powerschool
        .type('[id=fieldAccount]', username) // Fill in Username Field
        .type('[id=fieldPassword]', password) // Fill in Password Field
        .click('[type=submit]') // Submit Form (Calls Hashing on click)
        .wait(200) // Wait for Page to Load (Prevents Error)
        .goto('http://ps01.bergen.org/guardian/home.html') // Go To the Grades Page
        .evaluate(function() { // Get Array like [[course info], [tri1 grades], [tri2 grades], [tri3 grades]]
            // GET COURSE NAMES AND FILTER NON-GPA AND ELECTIVE COURSES
            var courseInfo = [], tri1 = [], tri2 = [], tri3 = [], complete = [];
            var elements = document.querySelectorAll("tr td[align=left]");
            for (var i = 0; i < elements.length; i++) {
                if (elements[i].textContent.charAt(0) != "~" && (elements[i].nextElementSibling.innerHTML != "&nbsp;" && elements[i].nextElementSibling.nextElementSibling.innerHTML != "&nbsp;" && elements[i].nextElementSibling.nextElementSibling.nextElementSibling.innerHTML != "&nbsp;")) {
                    courseInfo.push(elements[i].textContent);
                    tri1.push(elements[i].nextElementSibling.textContent); // Tri 1 Grade
                    tri2.push(elements[i].nextElementSibling.nextElementSibling.textContent); // Tri 2 Grade
                    tri3.push(elements[i].nextElementSibling.nextElementSibling.nextElementSibling.textContent); // Tri 3 Grade
                }
            }
            complete.push(courseInfo);
            complete.push(tri1);
            complete.push(tri2);
            complete.push(tri3);
            return complete;
        })
        yield nightmare.end();
        return info;
});

预先感谢您的帮助!

最佳答案

因此,看起来事情正在超时,因为您在请求内运行了一个长时间运行的生成器。

您通常不想实时执行此类操作,而是希望为每个学生预先抓取此信息,然后将其存储在数据库中,或者使用 kue 等工具异步执行此操作。 .

此外,我乍一看还注意到另一个问题:

您最初访问的网址无效。您正在访问 URL https://ps01.bergen.org,但您想要访问 URL https://ps01.bergen.org/public/

希望这有帮助!

关于node.js - Heroku 上的 Nightmare.JS 导致超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37475320/

相关文章:

ruby-on-rails-3 - 在 heroku 上生产之前部署到测试服务器

javascript - 获取 Nightmare.JS (v 2.9.1) 屏幕截图缓冲区

javascript - MacOS 上的 Grunt 通知失败

node.js - 清除NodeJS中的所有cookie

node.js - 安装 node_modules 时构建失败并显示 "host key verification failed"

ruby-on-rails - Delayed::Job.enqueue 将作业排队,Heroku 将它们从队列中清除,但我的执行方法从未被调用;为什么?

javascript - 从客户语音中提取字母数字字符串

node.js - 为什么 Node.js 是单线程的?

javascript - 使用 Nightmare.js 根据类名选择和单击元素

javascript - 如何解决 Nightmare .click() 问题不传播?