我正在按照此示例访问Google表格API:
https://developers.google.com/sheets/api/quickstart/nodejs
在示例代码中,有以下方法来获取新的oauth令牌。
dispatch_group_wait
这在我的本地计算机上正常工作(在终端中按提示手动访问页面,并在命令行中输入代码)。但这似乎不切实际,并不适用于Heroku。有没有办法自动化这个?也许通过在nodeJS应用程序中获取URL(和令牌)并以某种方式存储它?
提前致谢。
答案 0 :(得分:7)
好的,所以我最终使用的服务帐户密钥可以在https://console.developers.google.com生成。这将生成一个JSON文件,您需要两个值:private_key
和client_email
。
要在本地测试,可以下载dotenv npm模块,该模块允许您将环境变量存储在项目根目录的.env
文件中。您的.env
文件将如下所示:
GOOGLE_PRIVATE_KEY=<your-key-here-withouth-quotes>
GOOGLE_CLIENT_EMAIL=<your-email-here-withouth-quotes>
在通过git部署heroku应用时,不要忘记将.env文件添加到.gitignore列表中。
我的auth.js
文件如下所示:
const GoogleAuth = require('google-auth-library');
const SCOPES = ['https://www.googleapis.com/auth/spreadsheets.readonly'];
function authorize() {
return new Promise(resolve => {
const authFactory = new GoogleAuth();
const jwtClient = new authFactory.JWT(
process.env.GOOGLE_CLIENT_EMAIL,
null,
process.env.GOOGLE_PRIVATE_KEY.replace(/\\n/g, '\n'),
SCOPES
);
jwtClient.authorize(() => resolve(jwtClient));
});
}
module.exports = {
authorize,
}
请注意私钥变量后面的替换功能。
我的app.js(主文件)如下所示:
require('dotenv').config();
const google = require('googleapis');
const sheetsApi = google.sheets('v4');
const googleAuth = require('./auth');
const SPREADSHEET_ID = 'Your-spreadsheet-ID';
googleAuth.authorize()
.then((auth) => {
sheetsApi.spreadsheets.values.get({
auth: auth,
spreadsheetId: SPREADSHEET_ID,
range: "'Tab Name'!A1:H300",
}, function (err, response) {
if (err) {
console.log('The API returned an error: ' + err);
return console.log(err);
}
var rows = response.values;
console.log(null, rows);
});
})
.catch((err) => {
console.log('auth error', err);
});
如果您收到以下错误:
The API returned an error: Error: The caller does not have permission
使用google_client_email分享您尝试加载的电子表格,然后重试。
如果一切都在本地运行,请通过访问您的heroku帐户将环境变量添加到您的heroku应用程序,然后转到settings
并单击reveal config vars
并部署该应用程序。如果一切顺利,您应该可以访问该文档。