2016-09-24 65 views
2

First Node/Express app。在Express路由器中使用GET請求的結果

我不知道如何從端點檢索數據並將其呈現在瀏覽器中,這讓我頭疼不已。

我有一個dataservice.js從一個端點得到一個JSON對象是這樣的:

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,其內容是可用的。

的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,但瀏覽器窗口掛起,並且永遠不會到達零件。

我知道只有在端點數據請求完成後才能完成渲染(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

這似乎工作。非常感謝!我現在將繼續與帕格模板搏鬥。 –

0

你是

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

但是沒有數據變量。它應該是

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

這是你在哪裏存儲你的數據的變量時,它來自回調

0

原因res.render()不會被調用是,HTTP請求是異步。獲得響應的回調必須被傳遞,你做了,但忘了給它調用的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] }); 
     } 
     }) 
});