2016-08-29 12 views
1

私は初心者ですので、できる限り最善の方法で問題を公開します。私は、サーバーサイドでGoogleアナリティクスAPIを呼び出して、反応とd3を使用してクライアント側にいくつかのデータを表示しようとしています。ここではGAのAPIを呼び出す私のスクリプトは次のとおりです。私は独立してこのスクリプトを呼び出す場合Node、Express、GoogleアナリティクスAPIを使用したコールバック地獄で失われた

var google = require ("googleapis"); 
var key = require ('./client_id.json'); 

const VIEW_ID = 'ga:80820965'; 

let jwtClient = new google.auth.JWT(
    key.client_email, 
    null, 
    key.private_key, 
    ['https://www.googleapis.com/auth/analytics.readonly'], 
    null 
); 

    jwtClient.authorize(function (err, tokens) { 
     if (err) { 
     console.log(err); 
     return; 
     } 
     let analytics = google.analytics('v3'); 
     queryData(analytics); 
    }); 

var queryData = function(analytics) { 
     analytics.data.ga.get({ 
     'auth': jwtClient, 
     'ids': VIEW_ID, 
     'metrics': 'ga:uniquePageviews', 
     'dimensions': 'ga:pagePath', 
     'start-date': '30daysAgo', 
     'end-date': 'yesterday', 
     'sort': '-ga:uniquePageviews', 
     'max-results': 10, 
     }, function (err, response) { 
     if (err) { 
      console.log(err); 
      return; 
     } 
     console.log(JSON.stringify(response, null, 4)); 
     }); 
    } 


module.exports = { 
    queryData 
}; 

すべてが、私は次のエラーを持っている私のプロジェクト全体でそれを呼んでいるがとき、罰金です:

[1] analytics.data.ga.get({ 
[1]   ^
[1] 
[1] TypeError: Cannot read property 'data' of undefined 

analyticsが定義されていないため、dataは未定義です。そしてanalyticsは、この呼び出しため、未定義である:

jwtClient.authorize(function (err, tokens) { 
     if (err) { 
     console.log(err); 
     return; 
     } 
     let analytics = google.analytics('v3'); 
     data = queryData(analytics); 
    }); 

は、非同期呼び出しです。私は、client_idがロードされる時を推測します。

let analytics = google.analytics('v3'); 
     data = queryData(analytics); 

準備ができている:queryDataがこの部分はときにのみ実行されているように

は、どのように私は、このスクリプトを書くことができますか?

私の問題がはっきりしていて、意味をなさないことを願っています。私はasync/awaitモジュールについて読んだことがあります。しかし、私はそれを自分のものとして使うことはできません。

編集#1:私はこのようなものを使用する必要がありますが、私は

module.exports = {queryData: function (err, req, res, next) { next(); }}; 

答えて

3

あなたがここにローカル変数としてanalyticsを定義しているかどうかはわかりません。

jwtClient.authorize(function (err, tokens) { 
    if (err) { 
    console.log(err); 
    return; 
    } 
    let analytics = google.analytics('v3'); 
    queryData(analytics); 
}); 

をそして期待それはあなたの輸出のqueryData(analytics)でここに利用できるようになります。

代わりにあなたのauthorizeコールを解決することができます(最初の初期化時に競合状態が発生する可能性があるため、プロミスでラップして解決するまで待つことができます)。queryData )。このような何か:

var google = require ("googleapis"); 
var key = require ('./client_id.json'); 
const Promise = require('bluebird'); 
var authorizationPromise; 

const VIEW_ID = 'ga:80820965'; 

let jwtClient = new google.auth.JWT(
    key.client_email, 
    null, 
    key.private_key, 
    ['https://www.googleapis.com/auth/analytics.readonly'], 
    null 
); 

authorizationPromise = Promise.promisify(jwtClient.authorize)() 
.then(function (err, tokens) { 
    if (err) { 
    throw new Error(err); 
    } 

    return google.analytics('v3'); 
}) 
.catch(function(err) { 
    console.log(err); 
}); 

var queryData = function() { 
    authorizationPromise.then(function(analytics) { 
     analytics.data.ga.get({ 
     'auth': jwtClient, 
     'ids': VIEW_ID, 
     'metrics': 'ga:uniquePageviews', 
     'dimensions': 'ga:pagePath', 
     'start-date': '30daysAgo', 
     'end-date': 'yesterday', 
     'sort': '-ga:uniquePageviews', 
     'max-results': 10, 
     }, function (err, response) { 
     if (err) { 
      console.log(err); 
      return; 
     } 
     console.log(JSON.stringify(response, null, 4)); 
     }); 
    }); 
}; 

module.exports = { 
    queryData 
}; 

私は、オフ手jwtClient.authorizeは約束のAPIを提供しているかどうかはわからないので、私はちょうどそれがbluebirdを使用して「promisified」。

+0

ありがとうございます。私は今、自分の問題を本当に理解しています。しかし、私はあなたのコードを試して、次のエラーを取得しました。 '未定義のrefreshToken_'プロパティを読み込めません。 –

+1

@SimonBreton、問題ありません。私は知らない、私は上記のコードをテストしていない。私はちょうどこのタイプの状況のた​​めにかなり一般的なパターンを実装しましたが、スタックトレースを調べて、そのエラーがどこから来ているのかを調べなければならないかもしれません。申し訳ありませんが、私はもっと助けになることはできませんでした。あなたが進むにつれて他の質問があれば教えてください... –

+0

あなたは 'authorizationPromise'コードに関するもう少し詳細を教えてください。私は特に 'tokens'変数の使用を理解していません。ありがとう。 –

関連する問題