YouTube API 错误,Node.js
Posted
技术标签:
【中文标题】YouTube API 错误,Node.js【英文标题】:YouTube API Error, Node.js 【发布时间】: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 有问题吗?
【问题讨论】:
【参考方案1】:您的client_secret.json
文件缺少"redirect_uris"
的密钥
参见下面的示例文件:
"installed":
"client_id": "YOUR_CLIENT_ID_HERE",
"client_secret": "YOUR_CLIENT_SECRET_HERE",
"redirect_uris": ["http://localhost:8080/oauth2callback"],
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://accounts.google.com/o/oauth2/token"
【讨论】:
以上是关于YouTube API 错误,Node.js的主要内容,如果未能解决你的问题,请参考以下文章
youtube api 401 错误 youtubeSigupRequired