代码之家  ›  专栏  ›  技术社区  ›  t33n

谷歌API谷歌驱动节点。js无法上载文件oAuth2

  •  0
  • t33n  · 技术社区  · 7 年前

    嘿,我已经试了6个多小时了,什么都没用。我走了这么远。。

    var fs = require('fs');
    var readline = require('readline');
    var google = require('googleapis');
    var googleAuth = require('google-auth-library');
    
    // If modifying these scopes, delete your previously saved credentials
    // at ~/.credentials/drive-nodejs-quickstart.json
    var SCOPES = ['https://www.googleapis.com/auth/drive.metadata.readonly'];
    var TOKEN_DIR = (process.env.HOME || process.env.HOMEPATH ||
        process.env.USERPROFILE) + '/.credentials/';
    var TOKEN_PATH = TOKEN_DIR + 'drive-nodejs-quickstart.json';
    
    // Load client secrets from a local file.
    fs.readFile('client_secret.json', function processClientSecrets(err, content) {
      if (err) {
        console.log('Error loading client secret file: ' + err);
        return;
      }
      // Authorize a client with the loaded credentials, then call the
      // Drive API.
      authorize(JSON.parse(content), listFiles);
    });
    
    /**
     * Create an OAuth2 client with the given credentials, and then execute the
     * given callback function.
     *
     * @param {Object} credentials The authorization client credentials.
     * @param {function} callback The callback to call with the authorized client.
     */
    function authorize(credentials, callback) {
      var clientSecret = credentials.installed.client_secret;
      var clientId = credentials.installed.client_id;
      var redirectUrl = credentials.installed.redirect_uris[0];
      var auth = new googleAuth();
      var oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl);
    
      // Check if we have previously stored a token.
      fs.readFile(TOKEN_PATH, function(err, token) {
        if (err) {
          getNewToken(oauth2Client, callback);
        } else {
          oauth2Client.credentials = JSON.parse(token);
          callback(oauth2Client);
        }
      });
    }
    
    /**
     * Get and store new token after prompting for user authorization, and then
     * execute the given callback with the authorized OAuth2 client.
     *
     * @param {google.auth.OAuth2} oauth2Client The OAuth2 client to get token for.
     * @param {getEventsCallback} callback The callback to call with the authorized
     *     client.
     */
    function getNewToken(oauth2Client, callback) {
      var authUrl = oauth2Client.generateAuthUrl({
        access_type: 'offline',
        scope: SCOPES
      });
      console.log('Authorize this app by visiting this url: ', authUrl);
      var rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
      });
      rl.question('Enter the code from that page here: ', function(code) {
        rl.close();
        oauth2Client.getToken(code, function(err, token) {
          if (err) {
            console.log('Error while trying to retrieve access token', err);
            return;
          }
          oauth2Client.credentials = token;
          storeToken(token);
          callback(oauth2Client);
        });
      });
    }
    
    /**
     * Store token to disk be used in later program executions.
     *
     * @param {Object} token The token to store to disk.
     */
    function storeToken(token) {
      try {
        fs.mkdirSync(TOKEN_DIR);
      } catch (err) {
        if (err.code != 'EEXIST') {
          throw err;
        }
      }
      fs.writeFile(TOKEN_PATH, JSON.stringify(token));
      console.log('Token stored to ' + TOKEN_PATH);
    }
    
    /**
     * Lists the names and IDs of up to 10 files.
     *
     * @param {google.auth.OAuth2} auth An authorized OAuth2 client.
     */
    function listFiles(auth) {
      var service = google.drive('v3');
      service.files.list({
        auth: auth,
        pageSize: 10,
        fields: "nextPageToken, files(id, name)"
      }, function(err, response) {
        if (err) {
          console.log('The API returned an error: ' + err);
          return;
        }
        var files = response.files;
        if (files.length == 0) {
          console.log('No files found.');
        } else {
          console.log('Files:');
          for (var i = 0; i < files.length; i++) {
            var file = files[i];
            console.log('%s (%s)', file.name, file.id);
          }
        }
      });
    }
    

    当我重新运行这个脚本时,我得到

    Files:
    sample file.mp4 (123456789sampelcode)
    projektname (123456789sampelcode)
    Getting started (123456789sampelcode)
    

    连接现在与令牌一起工作,因为我不需要重新输入某些内容。我现在真的不知道如何上传文件。当我尝试包含我自己的上传功能时,我无法使用它,因为我无法将其与登录过程结合起来。我看到了

    function listFiles(auth) {
    }
    

    在登录后默认执行。所以我想我在这个函数中输入我的代码,它会工作的。所以创建了这个

    function listFiles(auth) {
    var drive = google.drive('v3');
    var fileMetadata = {
      'name': 'photo.jpg'
    };
    var media = {
      mimeType: 'image/jpeg',
      body: fs.createReadStream('./photo.jpg')
    };
    drive.files.create({
       resource: fileMetadata,
       media: media,
       auth: auth,
       fields: 'id'
    }, function(err, file) {
      if(err) {
        // Handle error
        console.log(err);
      } else {
        console.log('File Id: ', file.id);
      }
    });
    
    }
    

    但什么都没发生。我的终端窗口是无尽的负荷。没有错误,什么都没有。

    版本2-这是我的第二个版本。也没有日志没有什么只是无尽的加载。我打开了防火墙,所以防火墙、防病毒软件或其他什么都没有问题,因为在默认脚本中,我可以从我的googledrive中看到文件

    const fs = require('fs');
    const readline = require('readline');
    const google = require('googleapis');
    const googleAuth = require('google-auth-library');
    const drive = google.drive('v3');
    
    // If modifying these scopes, delete your previously saved credentials
    // at ~/.credentials/drive-nodejs-quickstart.json
    var SCOPES = ['https://www.googleapis.com/auth/drive'];
    var TOKEN_DIR = (process.env.HOME || process.env.HOMEPATH ||
           process.env.USERPROFILE) + '/.credentials/';
    var TOKEN_PATH = TOKEN_DIR + 'drive-nodejs-quickstart.json';
    
    
    // Load client secrets from a local file.
    fs.readFile('client_secret.json', function processClientSecrets(err, content) {
         if (err) {
           console.log('Error loading client secret file: ' + err);
           return;
         }
         // Authorize a client with the loaded credentials, then call the
         // Drive API.
         //authorize(JSON.parse(content), listFiles);
         authorize(JSON.parse(content), real_upload_files);
    });
    
    /*
        * Create an OAuth2 client with the given credentials, and then execute the
        * given callback function.
        *
        * @param {Object} credentials The authorization client credentials.
        * @param {function} callback The callback to call with the authorized client.
        */
    function authorize(credentials, callback) {
         var clientSecret = credentials.installed.client_secret;
         var clientId = credentials.installed.client_id;
         var redirectUrl = credentials.installed.redirect_uris[0];
         var auth = new googleAuth();
         var oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl);
    
    
         // Check if we have previously stored a token.
         fs.readFile(TOKEN_PATH, function(err, token) {
           if (err) {
             getNewToken(oauth2Client, callback);
             //console.log('5')
           } else {
             oauth2Client.credentials = JSON.parse(token);
             callback(oauth2Client);
             // console.log('4')
           }
         });
    } // function authorize(credentials, callback) {
    
    
    
    
    
    function real_upload_files(auth) {
    
    
    var fileMetadata = {
         'name': 'photo.jpg'
    };
    var media = {
         mimeType: 'image/jpeg',
         body: fs.createReadStream('./photo.jpg')
    };
    drive.files.create({
          resource: fileMetadata,
          media: media,
          auth: auth,
          fields: 'id'
    }, function(err, file) {
         if(err) {
           // Handle error
           console.log(err);
         } else {
           console.log('File Id: ', file.id);
         }
    });
    
    
    } // function real_upload_files(auth) {
    

    另外,如果我将auth:auth更改为auth:oauth2Client,并在函数中也更改它,那么加载屏幕的结果将是相同的。

    有人能告诉我如何上传文件或用oAuth2做其他事情吗?我找到了as节点。js新手表示,要为节点查找的示例代码太少了。js..请帮助我,伙计们,我为此付出了很大的努力..请帮助:D使用dropbox需要10分钟,但在那里我很容易使用API键。。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Tanaike    7 年前

    我认为你的剧本没有错。在我的环境中,你的脚本运行良好。因此,我提出以下两个修改。

    1. C:\Users\Administrator.credentials 关于你的问题,你使用的是windows操作系统。如果是这样,你能用 cmd.exe
    2. 如何使用 readFile() 用于读取文件? readFile() 可以将文件中的全部数据读取到内存中。所以我认为这个错误是可以避免的。但是如果文件大小很大,我建议使用 createReadStream() createReadStream() 作为带有windows操作系统的终端。

    修改的脚本:

    function real_upload_files(auth) {
        fs.readFile('./photo.jpg', function(err, content){
            var fileMetadata = {
                'name': 'photo.jpg',
            };
            var media = {
                mimeType: 'image/jpeg',
                body: new Buffer(content, 'binary'),
            };
            drive.files.create({
                resource: fileMetadata,
                media: media,
                auth: auth,
                fields: 'id',
            }, function(err, file) {
                if (err) {
                    console.log(err);
                } else {
                    console.log('File Id: ', file.id);
                }
            });
        });
    }