2017-12-25 19 views
0

Ich versuche, eine HTTP-Anfrage alle 2 Sekunden mit dem node-cron Modul zu machen.Knoten, Fehler mit Node-Cron mit http Anfrage

Ich habe apiCalls.js;

var http = require('https'); 

module.exports = { 
    getData: function(callback) { 
    var options = { 
     host: 'google.com', 
     path: '/index.html' 
    }; 

    var req = http.get(options, function(res) { 
     console.log('STATUS: ' + res.statusCode); 
     console.log('HEADERS: ' + JSON.stringify(res.headers)); 


     var bodyChunks = []; 
     res.on('data', function(chunk) { 

     bodyChunks.push(chunk); 
     }).on('end', function() { 
     var body = Buffer.concat(bodyChunks); 
     console.log('BODY: ' + body); 
     callback(body); 

     }) 
    }); 

    req.on('error', function(e) { 
     console.log('ERROR: ' + e.message); 
    }); 
    } 
} 

Das funktioniert gut. Ich möchte dies alle 2 Sekunden aufrufen und später möchte ich die Ansichtsdatei aktualisieren. Hier weiß ich nicht ob ich socket.io brauche oder ich kann es mit reagieren.

Ich rufe diese Funktion in index.js;

Aber ich bekomme Fehler, wie es scheint, habe ich bereits die Header gesetzt. Wie kann ich das machen?

_http_outgoing.js:503 
    throw new errors.Error('ERR_HTTP_HEADERS_SENT', 'set'); 
    ^

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client 
    at validateHeader (_http_outgoing.js:503:11) 

Danke

Antwort

0

Das Problem darin liegt, dass Sie res.render() immer und immer wieder alle 2 Sekunden in Ihrem route.get() Handler aufrufen - Sie nur noch eine letzte res.render() pro Request-Handler haben können. Sie können nicht erwarten, dass Ihre Website automatisch alle 2 Sekunden nach der Anforderung aktualisiert wird, so wie Sie sie codiert haben. Sie können entweder den Client die Anfrage alle N Sekunden senden (nicht effizient, wohlgemerkt) oder verwenden Sie etwas effizienteres wie Web-Socket, um das zu erreichen.

+0

Ich benutze jetzt socket.io, aber ich konnte die Ansicht nach der HTTP-Anfrage nicht aktualisieren. Wenn ich 'io.connect..' und den Cron-Job verwende. Immer wenn ein Benutzer eine Verbindung herstellt, werden mehrere HTTP-Anfragen gesendet. –

+0

Ohne zu sehen, wie Sie socket.io in Ihrem Server/Client verwenden, bin ich mir nicht sicher, was das Problem ist. Auch die Verwendung von io.connect in Ihrem Cron-Job riecht schon nach Problemen, denke ich. –