2016-09-24 5 views
2

First Node/Express-App.Verwenden der Ergebnisse einer GET-Anforderung im Express-Router

Ich habe mich schwer damit beschäftigt, Daten von einem Endpunkt abzurufen und im Browser zu rendern.

Ich habe einen dataservice.js, die ein JSON-Objekt von einem Endpunkt wie folgt erhält:

const http = require('http'); 

getFinhockeyData = function() { 

    http.get('http://tilastopalvelu.fi/ih/modules/mod_standings/helper/standings.php?statgroupid=3545', (res) => { 
     console.log(`Got response: ${res.statusCode}`); 

     var body = ""; 

     res.on('data', function (chunk) { 
     body += chunk; 
    }) 

     res.on('end', function() { 
     var data = JSON.parse(body); 
     console.log('data parsed.'); 
     console.log('first team name: ' + data.teams[0].TeamName); 
     console.log(typeof data); 
     return data; 
    }) 

    }).on('error', (e) => { 
     console.log(`Got error from Finhockey: ${e.message}`); 
    }); 
} 

module.exports.getFinhockeyData = getFinhockeyData; 

Bisher Dinge funktionieren und das data Objekt kann Inhalt ist verwendbar console.logged und sein wird.

Die router.js sieht derzeit wie folgt aus:

'use strict'; 

const express = require('express'); 
const async = require('async'); 
const router = express.Router(); 
const dataservice = require('./dataservice.js') 


router.get('/', function(req, res) { 
    async.series([ 
      function(callback) { 
       getFinhockeyData(callback) 
      } 
     ], 
     function(err, results) { 
      console.log('start rendering'); 
      res.render('index', { data: data }); 
     }) 
}); 

module.exports = router; 

Wenn ich die app und aktualisieren Sie die/Route laufen, ich von der Konsole sehen, dass die getFinhockeyData genannt wird und der Inhalt des Datenobjekts ist in dataservice.js console.logs, aber das Browserfenster hängt und der res.render Teil wird nie erreicht.

Ich verstehe, dass das Rendering erst nach dem Endpunkt Datenanforderung beendet werden sollte (async.series Nutzung), aber es scheint, dass ich ein grundlegendes Verständnis, wie die Ergebnisdaten aus der getFinhockeyData Funktion in der tatsächlichen verwenden Hauptroute.

Irgendwelche Ratschläge dazu? Ich werde Ihnen gerne weitere Informationen zur Verfügung stellen.

Antwort

1

Erstens ist die Anfrage asynchron, so dass Sie entweder einen Rückruf oder eine Zusage verwenden müssen.
Auch die Asynchron-Middleware werden Sie nur von einem asynchronen Aufruf zurückkehren Daten nicht zulassen, erfordert es einen Rückruf, aber mit nativen Versprechen scheint hier leichter

const http = require('http'); 

getFinhockeyData = function() { 
    return new Promise((resolve, reject) => { 
    http.get('http://tilastopalvelu.fi/ih/modules/mod_standings/helper/standings.php?statgroupid=3545', (res) => { 
     var body = ""; 

     res.on('data', function(chunk) { 
     body += chunk; 
     }); 

     res.on('end', function() { 
     resolve(JSON.parse(body)); 
     }); 

    }).on('error', reject); 
    }); 
} 

module.exports.getFinhockeyData = getFinhockeyData; 

Beachten Sie auch, dass Sie mit einem als Modul exportieren, Immobilien

module.exports.getFinhockeyData = getFinhockeyData; 

, wenn Sie, dass in den Routen verwenden werden, haben Sie die Eigenschaft

const dataservice = require('./dataservice.js'); 

router.get('/', function(req, res) { 
    dataservice.getFinhockeyData().then(function(data) { 
     res.render('index', { data: JSON.stringify(data) }); 
    }).catch(function(err) { 
     // epic fail, handle error here 
    }); 
}); 
+0

Dies scheint zu funktionieren. Danke vielmals! Ich werde jetzt mit Mops-Vorlagen ringen. –

0

Sie verwenden Antworten auf Ihre Route Anruf mit

Aber es gibt keine Datenvariable. Es sollte

res.render('index', { data: results }); 

sein, die die Variable ist, wo Sie Ihre Daten speichern, wenn es aus dem Rückruf

0

Der Grund für res.render() nicht genannt wird, ist kommt, sind HTTP-Anfragen async. Um die Antwort muss ein Rückruf übergeben werden, die Sie getan haben, aber vergessen, es in den dataservice.js zu nennen

Dies sollte helfen ...

ändern dataservice.js wie folgt ...

const http = require('http'); 

getFinhockeyData = function(callback) { 

    http.get('http://tilastopalvelu.fi/ih/modules/mod_standings/helper/standings.php?statgroupid=3545', (res) => { 
     console.log(`Got response: ${res.statusCode}`); 

     var body = ""; 

     res.on('data', function (chunk) { 
     body += chunk; 
    }) 

     res.on('end', function() { 
     var data = JSON.parse(body); 
     console.log('data parsed.'); 
     console.log('first team name: ' + data.teams[0].TeamName); 
     console.log(typeof data); 
     callback(null, data); //returning the data to the callback 
    }) 

    }).on('error', (e) => { 
     console.log(`Got error from Finhockey: ${e.message}`); 
     callback(e, null); 
    }); 
} 

module.exports.getFinhockeyData = getFinhockeyData; 

ändern Router.js wie folgt ...

router.get('/', function(req, res) { 
    async.series([ 
      function(callback) { 
       getFinhockeyData(callback) 
      } 
     ], 
     function(err, results) { 
     if(err === null){ 
      console.log('start rendering'); 
      res.render('index', { data: results[0] }); 
     } 
     }) 
}); 
Verwandte Themen