首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Node.js函数外部访问变量数据?

如何在Node.js函数外部访问变量数据?
EN

Stack Overflow用户
提问于 2014-09-15 17:03:33
回答 2查看 1.8K关注 0票数 0

这是Node.js中的一个函数,它从分析中读取数据:

代码语言:javascript
复制
function getDataFromGA(Dimension, Metric, StartDate, EndDate, MaxResults) {
var fs = require('fs'),
    crypto = require('crypto'),
    request = require('request'); // This is an external module 

var authHeader = {
        'alg': 'RS256',
        'typ': 'JWT'
    },
    authClaimSet = {
        'iss': '***t@developer.gserviceaccount.com', // Service account email
        'scope': 'https://www.googleapis.com/auth/analytics.readonly',
// We MUST tell them we just want to read data
        'aud': 'https://accounts.google.com/o/oauth2/token'
    },
    SIGNATURE_ALGORITHM = '**',
    SIGNATURE_ENCODE_METHOD = '**',
    GA_KEY_PATH = '**',
  //finds current directory then appends  private key to the directory
    gaKey;

function urlEscape(source) {
    return source.replace(/\+/g, '-').replace(/\//g, '_').replace(/\=+$/, '');
}

function base64Encode(obj) {
    var encoded = new Buffer(JSON.stringify(obj), 'utf8').toString('base64');
    return urlEscape(encoded);
}

function readPrivateKey() {
    if (!gaKey) {
        gaKey = fs.readFileSync(GA_KEY_PATH, 'utf8');
    }
    return gaKey;
}

var authorize = function (callback) {

    var self = this,
        now = parseInt(Date.now() / 1000, 10), // Google wants us to use seconds
        cipher,
        signatureInput,
        signatureKey = readPrivateKey(),
        signature,
        jwt;

    // Setup time values
    authClaimSet.iat = now;
    authClaimSet.exp = now + 60; // Token valid for one minute

    // Setup JWT source
    signatureInput = base64Encode(authHeader) + '.' + base64Encode(authClaimSet);

    // Generate JWT
    cipher = crypto.createSign('RSA-SHA256');
    cipher.update(signatureInput);
    signature = cipher.sign(signatureKey, 'base64');
    jwt = signatureInput + '.' + urlEscape(signature);

    // Send request to authorize this application
    request({
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        uri: 'https://accounts.google.com/o/oauth2/token',
        body: 'grant_type=' + escape('urn:ietf:params:oauth:grant-type:jwt-bearer') +
            '&assertion=' + jwt
    }, function (error, response, body) {
        if (error) {
            console.log(error);
            callback(new Error(error));
        } else {
            var gaResult = JSON.parse(body);
            if (gaResult.error) {
                callback(new Error(gaResult.error));
            } else {
                callback(null, gaResult.access_token);
            //    console.log(gaResult);
                console.log("Authorized");

            }
        }
    });

};

var request = require('request'),
    qs = require('querystring');

authorize(function (err, token) {
    if (!err) {
        // Query the number of total visits for a month

        var requestConfig = {
            'ids': 'ga:72333024',
            'dimensions': Dimension,
            'metrics': Metric,
            // 'sort': '-ga:users',
            'start-date': StartDate,
            'end-date': EndDate,
            'max-results': MaxResults
        };

        request({
            method: 'GET',
            headers: {
                'Authorization': 'Bearer ' + token // Here is where we use the auth token
            },
            uri: 'https://www.googleapis.com/analytics/v3/data/ga?' + qs.stringify(requestConfig)
        }, function (error, resp, body) {
            console.log(body);
            var data = JSON.parse(body);
            console.log(data.totalsForAllResults);
            console.log(data.rows);
        });
    }
});
}

这里我尝试从外部访问它:

代码语言:javascript
复制
var gaJSON = utils.getDataFromGA("ga:country", "ga:pageviews", "2011-08-04", "2014-09-12", "50");
res.send(gaJSON);

我的问题是如何在第一个方法的末尾访问变量data?如何从函数外部调用它?

EN

回答 2

Stack Overflow用户

发布于 2014-09-15 17:17:28

您可以将数据赋给在第一个函数中声明的变量。但是因为authorize方法是异步的,所以在第一个函数结束时变量数据仍然是未定义的。要做到这一点,最好的方法是使用回调处理。

我想你想要返回一些与这个变量相关的东西,对吧?尝试将回调参数放到第一个函数中,然后调用此函数并传递结果。

callback(variable)

票数 0
EN

Stack Overflow用户

发布于 2014-09-15 21:11:19

为什么要从外部访问。??即使你非常想这样做,你也需要创建一个函数,将"data“作为参数传递,然后调用该函数。

代码语言:javascript
复制
console.log(body);
var data = JSON.parse(body);
myNewFunction(data);

在使用数据的"myNewFunction“中编写所有的逻辑。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25844370

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档