2016-05-27 16 views
1

Ich baue eine Website, die, wenn Leute ihre Anmeldeinformationen zu einer Website in der Anfrage Teil der URL eingeben sie auf dieser Website protokolliert und senden Sie Daten über ihr Konto zurück. Das lokale Testen dieses Codes erzeugt keine Fehler und geschieht ziemlich schnell. Ich bin mir nicht sicher, was es verursacht, dass es auf dem Server und nicht lokal ausläuft. HierNightmare.JS auf Heroku verursacht Timeout

ist die Protokolldatei von heroku logs

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 

Das Profil einen Befehl enthält diese Datei

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')); 
}); 

laufen Und hier ist 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; 
}); 

Vielen Dank im Voraus für jede Hilfe!

+0

Das hängt nicht mit Ihrer Frage zusammen, aber ich fühle mich gezwungen, es zu erwähnen: Sie wollen nie, dass jemand Ihnen seinen Benutzernamen und Ihr Passwort innerhalb der URL-Parameter sendet, wie Sie es hier tun. Das ist wirklich eine schlechte Sicherheitsvorkehrung, da diese Log-Dateien diesen Benutzernamen/Passwort im Klartext enthalten, und diese Dateien werden von Heroku und auch von einigen Ihrer Addon-Provider gespeichert, was bedeutet, dass Sie nun Benutzeranmeldeinformationen in vielen anderen haben Systeme der Menschen. Es ist viel besser, dass Benutzer diese Daten im Hauptteil einer POST-Anfrage bereitstellen. – rdegges

+0

Ja, ich bin mir dessen bewusst, aber ich möchte nur testen, ob was ich tun möchte, ist auf Heroku möglich, ich beabsichtige ihnen innerhalb einer Post Anfrage, nachdem ich das funktioniert habe. – TimmyO18

Antwort

1

Es sieht also so aus, als würden die Dinge auslaufen, weil in einer Anfrage ein lang laufender Generator läuft.

Sie möchten in der Regel nicht so etwas in Echtzeit machen, sondern diese Informationen für jeden Schüler entweder vorkratzen, dann in einer Datenbank speichern oder asynchron mit einem Werkzeug wie kue .

Auch bemerkte ich eine weitere Frage auf den ersten Blick:

Die URL, die Sie zunächst treffen sind nicht gültig ist. Sie treffen die URL https://ps01.bergen.org, aber Sie möchten die URL drücken https://ps01.bergen.org/public/

Hope this hilft!

Verwandte Themen