2016-09-24 6 views
2

最初のNode/Expressアプリケーション。ExpressルータでGET要求の結果を使用

エンドポイントからデータを取得してブラウザにレンダリングする方法について私の頭が悩まされています。今までは

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; 

物事が仕事とdataオブジェクトがconsole.loggedすることができ、その内容が使用可能である:

は、私はこのようなエンドポイントからJSONオブジェクトを取得dataservice.jsを持っています。

router.jsは現在、次のようになります。

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

私はアプリを実行して、/ルートを更新すると、私はgetFinhockeyDataが呼び出され、データオブジェクトの内容はで利用可能ですコンソールから見ることができますdataservice.jsのconsole.logsが表示されますが、ブラウザウィンドウがハングし、res.render部分には決して行きません。

レンダリングは、エンドポイントデータリクエストが完了した後でなければならないことを理解していますが(async.seriesの使用法)、getFinhockeyData関数の結果データを実際にどのように使用するかに関する基本的な理解が不足しているようです主要ルート。

これに関するアドバイスはありますか?必要に応じてより多くの情報を提供しています。

答えて

1

まず、要求を行うことは非同期であるため、コールバックまたは約束を使用する必要があります。非同期ミドルウェアは、あなただけの非同期呼び出しからデータを返させません
はさえ、それがコールバックを必要としますが、ネイティブの約束を使用すると、簡単に思えるここ

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; 

はまた、あなたが持つモジュールとして書き出すことに注意してくださいプロパティ

module.exports.getFinhockeyData = getFinhockeyData; 

あなたが使用しようとしているときのルートで、あなたは

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

これは動作しているようです。どうもありがとう!私は今Pugのテンプレートと格闘に移ります。 –

0

プロパティを使用しなければならないことをあなたはしていますあなたのルート通話に応答する

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

しかし、データ変数はありません。それはあなたがそれがコールバック

0

で呼び出されていないres.render()理由から来るとき、HTTP要求が非同期ですあなたのデータを格納する変数である

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

でなければなりません。あなたがやったけどdataservice.js

これは役立つはずで、それに電話をするのを忘れた、コールバックを渡す必要があります応答、...

があなたのdataservice.js、次のようなを変更を取得するには...

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; 

ルータを変更してください。jsのように...

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] }); 
     } 
     }) 
}); 
関連する問題