gpt4 book ai didi

javascript - 迷失在 Node、Express 和谷歌分析 API 的回调 hell 中

转载 作者:行者123 更新时间:2023-11-30 11:51:50 25 4
gpt4 key购买 nike

我是这里的初学者,所以我会尽力以最好的方式揭露我的问题。我正在尝试在服务器端调用 Google Analytics API,以使用 react 和 d3 在客户端显示一些数据。这是我调用 GA 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

据我所知,data 是未定义的,因为 analytics 是未定义的。并且 analytics 是未定义的,因为这个调用:

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

是一个异步调用。我猜是加载 client_id 的时间。

那么我该如何编写这个脚本,以便 queryData 仅在这部分运行:

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

准备好了吗?

我希望我的问题很清楚并且对您有意义。我读过异步/等待模块。但是我不能自己使用它。

编辑#1:我需要使用这样的东西,但我不确定如何使用

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

最佳答案

您在这里将 analytics 定义为局部变量:

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

然后期望它在导出的 queryData(analytics) 中可用。

你可以做的是在 promise 中解决你的 authorize 调用(因为当它第一次初始化时会有竞争条件,所以你可以将它包装在 promise 中并等待它解决在能够调用 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 是否提供了一个 promise API,所以我只是使用 bluebird 来“promisified”它.

关于javascript - 迷失在 Node、Express 和谷歌分析 API 的回调 hell 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39215475/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com