Javascript Node.js变量在函数外的使用

Javascript Node.js变量在函数外的使用,javascript,node.js,express,webstorm,Javascript,Node.js,Express,Webstorm,我正在尝试这样做,以便我可以将trends变量从其函数传递到我的Pug模板的渲染器中,但我似乎无法做到这一点 var express = require('express'); var router = express.Router();

我正在尝试这样做,以便我可以将trends变量从其函数传递到我的Pug模板的渲染器中,但我似乎无法做到这一点

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”变量传递到渲染器中。感谢您的帮助

记住,
hotTrends
,因为它从谷歌的API中获取结果。由于渲染器位于回调之外,
ustrends
uktrends
被设置为值,因此不能保证在调用渲染器之前设置这些值

您可以使用多个嵌套回调,但这会导致一些代码被推到非常右边;我推荐使用这个库,它有一个名为的函数,允许您传入1)一个要按顺序执行的函数数组,以及2)一个回调,该回调将在函数完成后执行,如果有错误,它会将错误和函数的结果作为参数。在下面的代码段中,trends 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 */
})

到底是什么引起了麻烦?在呈现的输出中,
ustrends
uktrends
是空的还是空的,或者其他您没有预料到的东西?如果问题是变量范围,请首先尝试:router.get('/',auth.connect(basic),function(req,res,next){var resultObj;resultObj.ustrends=ustrends;resultObj.uktrends=uktrends;res.json(resultObj);}); 当您请求/url时,是否看到一个空对象?