2016-07-03 10 views
1

Ich versuche, es so zu machen, dass ich meine Trends-Variable von seiner Funktion in einen Renderer für meine Pug-Vorlage übergeben kann, und ich kann es nicht scheinen.Node.js Variable Verwendung außerhalb der Funktion

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;                                         

Wie Sie sehen können, ich versuche, die „ustrends“ und „uktrends“ Variablen in den Renderer zu übergeben. Jede Hilfe wird geschätzt.

+0

Was genau verursacht Ärger? Sind 'Ustrends' und' Uktrends' leer oder null oder etwas anderes, was Sie nicht erwartet haben, in der gerenderten Ausgabe? – kevin628

+0

, wenn das Problem der Variablen Umfang ist, versuchen Sie zunächst: router.get ('/', auth.connect (basic), Funktion (req, res, next) {var resultObj; resultObj.ustrends = ustrends; resultObj .uktrends = uktrends; res.json (resultObj); }); sehen Sie ein leeres Objekt, wenn Sie die/URL anfordern? – SamiX

Antwort

1

Denken Sie daran, dass hotTrendswill return a promise, wie es Ergebnisse von Googles API erhält. Da der Renderer außerhalb der Callbacks liegt, wobei ustrends und uktrends auf Werte gesetzt sind, gibt es keine Garantie dafür, dass diese Werte vor dem Aufruf des Renderers festgelegt werden.

Sie könnten mehrere verschachtelte Rückrufe verwenden, aber das würde dazu führen, dass etwas Code recht weit nach rechts geschoben wird; Ich empfehle die async Bibliothek, die eine Funktion hat, die series genannt wird, die Ihnen erlaubt 1) ein Array von Funktionen, die in der Reihenfolge auszuführen sind, und 2) einen Rückruf, der ausgeführt wird, nachdem die Funktionen ausgeführt werden, einen Fehler wenn es gab, auszuführen eins und das Ergebnis der Funktionen als Argument. Im nachstehenden Ausschnitt gibt die trends-API Ergebnisse zurück, bevor der Renderer aufgerufen wird:

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 */ 
}) 
Verwandte Themen