2016-09-24 13 views
2

첫 번째 노드/익스프레스 응용 프로그램.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 있습니다. 나는 응용 프로그램을 실행하고/경로를 새로 고칠 때, 나는이 (가) getFinhockeyData이라고합니다 콘솔 및 데이터 객체의 내용에서 볼 수

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

에서 사용할 수 있습니다 :

router.js은 다음과 같이 현재 보이는 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 }); 

그러나 데이터 변수가 없습니다. 그것이라고하지 res.render()에 대한 이유는 콜백

0

에서 올 때 당신은 당신의 데이터를 저장하는 변수입니다 어느

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

해야한다, 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] }); 
     } 
     }) 
});