【问题标题】:YouTube API Error, Node.jsYouTube API 错误,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 有问题吗?

【问题讨论】:

    标签: node.js oauth-2.0 youtube-data-api


    【解决方案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"
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2023-03-22
      • 1970-01-01
      • 2018-07-02
      • 2011-07-13
      • 2015-08-09
      • 2017-01-10
      • 2012-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多