2016-07-03 2 views
1

내 추세 변수를 해당 함수에서 내 Pug 템플릿의 렌더러로 전달할 수 있도록하려고합니다. 그렇게 할 수 없습니다. Node.js 변수가 함수 외부에서 사용됩니다.

var express = require('express');                                 
var router = express.Router();                                  
var googleTrends = require('google-trends-api');                              
var auth = require('http-auth');                                  
var ustrends;                                      
var uktrends;                                      
const Console = require('console').Console;                               
var basic = auth.basic({                                    
    realm: "Web."                                    
}, function (username, password, callback) { // Custom authentication method.                     
    callback(username === "user" && password === "pass");                          
    }                                        
);                                         

var find = ',';                                      
var regex = new RegExp(find, 'g');                                 


googleTrends.hotTrends('US').then(function(trends){                             
ustrends = trends                                    
});                                         

googleTrends.hotTrends('EU').then(function(trends1) {                            
uktrends = trends1                                    
});                                         

console.log(ustrends);                                    
/* GET home page. */                                     


router.get('/', auth.connect(basic), function(req, res, next) {                          
res.render('index', {trends: ustrends.toString().replace(regex, ", "), trends1: uktrends.toString().replace(regex, ", "), title: 'Trends in the U.S & U.K'}); 

});                                         

module.exports = router;                                         

당신이 볼 수 있듯이

, 나는 렌더러에 "ustrends"와 "uktrends"변수를 전달하기 위해 노력하고있어. 어떤 도움을 주셔서 감사합니다.

+0

정확하게 문제를 일으키는 것은 무엇입니까? 'ustrends'와'uktrends'가 비어 있거나 널인지, 아니면 당신이 예상하지 못한 것이 렌더링 된 출력에 있습니까? 문제가 변수 범위는 – kevin628

+0

경우 먼저 시도 : router.get 다음 ('/'auth.connect) (기본 함수 (REQ, 입술) { VAR의 resultObj; resultObj.ustrends의 =의 ustrends; resultObj을 .uktrends = uktrends; res.json (resultObj); }); /url을 요청할 때 빈 개체가 보입니까? – SamiX

답변

1

Google의 API에서 얻은 결과이므로 hotTrendswill return a promise을 기억하십시오. 렌더러가 ustrendsuktrends이 값으로 설정된 콜백 외부에 있으므로 렌더러를 호출하기 전에 이러한 값이 설정된다는 보장이 없습니다.

중첩 된 콜백을 여러 개 사용할 수는 있지만 꽤 많은 코드가 오른쪽으로 밀려납니다. 나는 series이라는 함수를 가지고있다.이 함수는 1) 순서대로 실행될 함수의 배열과 2) 함수가 완료된 후에 실행될 콜백 (callback)을 전달할 수있게한다. 하나는 인수로 함수의 결과. 아래 스 니펫에서 트렌드 API는 렌더러가 호출되기 전에 결과를 반환합니다.

async.series([ 
    function(cb) { 
     googleTrends.hotTrends('US').then(function(trends){                             
      ustrends = trends; 
      cb(); 
     }) 
    }, 
    function(cb) { 
     googleTrends.hotTrends('EU').then(function(trends1) {                            
      uktrends = trends1; 
      cb();                                    
     }); 
    } 
], function(err, results) { 
    /* handle errors, do rendering stuff */ 
}) 
관련 문제