2016-07-03 4 views
1

私のtrend変数をその関数から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(basic)、function(req、res、next)){ var resultObj; resultObj.ustrends = ustrends; resultObj .uktrends = uktrends; res.json(resultObj); }); /urlをリクエストしたときに空のオブジェクトが表示されますか? – SamiX

答えて

1

GoogleのAPIから結果が得られるので、hotTrendswill return a promiseを覚えておいてください。レンダラーは、ustrendsuktrendsが値に設定されているコールバックの外にあるため、レンダラーが呼び出される前にこれらの値が設定される保証はありません。

いくつかのネストされたコールバックを使用することができますが、それはかなり近いところにプッシュされたコードにつながります。私はseriesという関数を持っていて、1)順番に実行される関数の配列と、2)関数が完了した後に実行されるコールバックを渡すことができるライブラリ1つの関数とその結果を引数とします。以下のスニペットでは、レンダラーが呼び出される前にトレンド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 */ 
}) 
関連する問題