【发布时间】:2019-02-04 18:01:03
【问题描述】:
When I try to connect with YouTube API (by node.js) this error show up:
var redirectUrl = credentials.installed.redirect_uris[0];
^
TypeError:无法读取未定义的属性“0”
在授权 (D:\Node.js\yt-api\server.js:37:56)
在 processClientSecrets (D:\Node.js\yt-api\server.js:24:3)
在 FSReqWrap.readFileAfterClose [as oncomplete] (fs.js:511:3)
var express = require('express');
var server = express();
var fs = 要求('fs')
var readline = require('readline');
var {google} = 要求('googleapis');
var OAuth2 = google.auth.OAuth2;
server.use(express.static('public'));
// 如果修改这些范围,请删除您之前保存的凭据
// 在 ~/.credentials/youtube-nodejs-quickstart.json
var SCOPES = ['https://www.googleapis.com/auth/youtube.readonly'];
var TOKEN_DIR = (process.env.HOME || process.env.HOMEPATH ||
process.env.USERPROFILE) + '/.credentials/';
var TOKEN_PATH = TOKEN_DIR + 'youtube-nodejs-quickstart.json';
// 从本地文件加载客户端机密。
fs.readFile('client_secret.json', function processClientSecrets(err, content) {
如果(错误){
console.log('加载客户端机密文件时出错:' + err);
返回;
}
// 使用加载的凭据授权客户端,然后调用 YouTube API。
授权(JSON.parse(内容),getChannel);
});
/**
* 使用给定的凭据创建一个 OAuth2 客户端,然后执行
* 给定回调函数。
*
* @param {Object} credentials 授权客户端凭证。
* @param {function} callback 与授权客户端调用的回调。
*/
功能授权(凭证,回调){
var clientSecret = credentials.installed.client_secret;
var clientId = credentials.installed.client_id;
var redirectUrl = credentials.installed.redirect_uris[0];
var oauth2Client = new OAuth2(clientId, clientSecret, redirectUrl);
// 检查我们之前是否存储了一个令牌。
fs.readFile(TOKEN_PATH,函数(错误,令牌){
如果(错误){
getNewToken(oauth2Client, 回调);
} 别的 {
oauth2Client.credentials = JSON.parse(token);
回调(oauth2Client);
}
});
}
/**
* 提示用户授权后获取并存储新的token,然后
* 使用授权的 OAuth2 客户端执行给定的回调。
*
* @param {google.auth.OAuth2} oauth2Client 要获取令牌的 OAuth2 客户端。
* @param {getEventsCallback} callback 授权调用的回调
* 客户。
*/
函数getNewToken(oauth2Client,回调){
var authUrl = oauth2Client.generateAuthUrl({
access_type: '离线',
范围:范围
});
console.log('通过访问这个 url 来授权这个应用程序:', authUrl);
var rl = readline.createInterface({
输入:process.stdin,
输出:process.stdout
});
rl.question('在此处输入该页面的代码:', function(code) {
rl.close();
oauth2Client.getToken(代码,函数(错误,令牌){
如果(错误){
console.log('尝试获取访问令牌时出错', err);
返回;
}
oauth2Client.credentials = 令牌;
存储令牌(令牌);
回调(oauth2Client);
});
});
}
/**
* 将令牌存储到磁盘以供以后的程序执行使用。
*
* @param {Object} token 要存储到磁盘的令牌。
*/
功能存储令牌(令牌){
尝试 {
fs.mkdirSync(TOKEN_DIR);
} 捕捉(错误){
if (err.code != 'EEXIST') {
抛出错误;
}
}
fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) => {
if (err) 抛出错误;
console.log('令牌存储到' + TOKEN_PATH);
});
console.log('令牌存储到' + TOKEN_PATH);
}
/**
* 列出最多 10 个文件的名称和 ID。
*
* @param {google.auth.OAuth2} auth 授权的 OAuth2 客户端。
*/
函数 getChannel(auth) {
var service = google.youtube('v3');
service.channels.list({
认证:认证,
部分:'sn-p,contentDetails,统计',
forUsername: '谷歌开发者'
},函数(错误,响应){
如果(错误){
console.log('API返回错误:' + err);
返回;
}
var 频道 = response.data.items;
如果(channels.length == 0){
console.log('没有找到频道。');
} 别的 {
console.log('这个频道的ID是%s,标题是\'%s\','+
'它有 %s 个视图。',
频道[0].id,
频道[0].sn-p.title,
频道[0].statistics.viewCount);
}
});
}
var port = process.env.port || 4001;
server.listen(端口,()=> {
console.log(`监听端口 ${port}`)
})
如何解决? oAuth2 有问题吗?
【问题讨论】:
标签: node.js oauth-2.0 youtube-data-api