簡體   English   中英

Javascript-Google Drive v3 API和函數

[英]Javascript - Google Drive v3 API and functions

嘗試使用JavaScript SDK創建與Google Drive v3 api的連接。

基本上,我要實現的最終目標是從google驅動器訪問各種文件並添加元數據(但還沒有到此為止)。

仔細瀏覽Google驅動器api指南( https://developers.google.com/drive/api/v3/quickstart/js )上的教程,它可以正常運行,並且我可以授權自己訪問文件等

我一直在努力清理代碼,因此我不會一遍又一遍地重復自己。

我曾經使用過GDrive Python SDK,但我可以很好地使用它,但是我真的在JavaScript SDK方面苦苦掙扎,因為我正試圖將python方面納入JavaScript,這可能只是我需要進行現實檢查?

因此,以下代碼循環遍歷每個搜索結果頁面,並在我的gDrive中找到擴展名為ZIP,RAR或TAR的所有文件,然后將結果插入HTML(以Google Drive示例為基礎):

function listFiles() {
    gapi.client.load('drive', 'v3', function () {
        gapi.client.init({}
        ).then(function () {
            gapi.client.drive.files.list({
                'q': "fileExtension = 'zip' or fileExtension = 'rar' or fileExtension = 'tar'",
                'pageSize': 10,
                'fields': "nextPageToken, files(id, name)",
            }).then(function (respo) {
                var token = respo.result.nextPageToken;
                gapi.client.drive.files.list({
                    'q': "fileExtension = 'zip' or fileExtension = 'rar' or fileExtension = 'tar'",
                    'fields': "nextPageToken, files(id, name)",
                    'pageToken': token
                }).then(function (result) {
                    appendPre('Files:');
                    console.log(result);
                    var files = result.result.files;
                    if (files && files.length > 0) {
                        for (var i = 0; i < files.length; i++) {
                            var file = files[i];
                            console.log(files[i]);
                            arr.push(files[i]);
                            appendPre(file.name + ' (' + file.id + ')');
                        }
                    } else {
                        appendPre('No files found.');
                    }
                })
            });
        });
    });
}

這行得通,但是我該如何清理呢? 例如創建函數? 我可能需要定期請求此文件列表,因此我嘗試創建一個函數:

function getFiles() {gapi.client.load('drive', 'v3', function () {
    gapi.client.init({}
        ).then(function () {
            gapi.client.drive.files.list({
                'q': "fileExtension = 'zip' or fileExtension = 'rar' or fileExtension = 'tar'",
                'pageSize': 10,
                'fields': "nextPageToken, files(id, name)",
            }).then(function (respo) {
                var token = respo.result.nextPageToken;
                gapi.client.drive.files.list({
                    'q': "fileExtension = 'zip' or fileExtension = 'rar' or fileExtension = 'tar'",
                    'fields': "nextPageToken, files(id, name)",
                    'pageToken': token
                })
            })
        })
    });
}

但是當我稱它為“ undefined”時

然后,我讀到可以將其創建為變量的地方,並像完整示例中那樣用“ .then”調用它。

但這在調用變量和執行“ .then”時給出“未定義”:

getFiles.then(function(respo){console.log(respo)})

無法獲取未定義或空引用的屬性“ then”

我究竟做錯了什么? 顯然有些東西,可能真的很愚蠢= [

任何幫助將不勝感激=]

我已經嘗試過您的代碼,它正在我這邊工作。 認證后,您無需再次調用gapi.client.init({}).then()

這是工作代碼:

function initClient() {
        gapi.client.init({
          discoveryDocs: DISCOVERY_DOCS,
          clientId: CLIENT_ID,
          scope: SCOPES
        }).then(function () {
          // Listen for sign-in state changes.
          gapi.auth2.getAuthInstance().isSignedIn.listen(updateSigninStatus);

          // Handle the initial sign-in state.
          updateSigninStatus(gapi.auth2.getAuthInstance().isSignedIn.get());
          authorizeButton.onclick = handleAuthClick;
          //signoutButton.onclick = handleSignoutClick;

          gapi.client.drive.files.list({
                'q': "fileExtension = 'zip' or fileExtension = 'rar' or fileExtension = 'tar'",
                'pageSize': 10,
                'fields': "nextPageToken, files(id, name)",
            }).then(function (respo) {
                appendPre('Files:');
          var files = respo.result.files;
          if (files && files.length > 0) {
            for (var i = 0; i < files.length; i++) {
              var file = files[i];
              appendPre(file.name + ' (' + file.id + ')');
            }
          } else {
            appendPre('No files found.');
          }
            })
        });
      }

我已經將您的代碼添加到初始initClient() ,並且可以按預期工作。

@Tanaike是正確的,您可以將pageSize調整為1000以在一頁中獲取所有文件。 但是請嘗試閱讀本教程以實現nextpageToken


更新

如果您指的是在Java腳本的函數內部調用的函數,則有可能,並且它也存在於Javascript快速入門中。

/**
       *  Initializes the API client library and sets up sign-in state
       *  listeners.
       */
      function initClient() {
        gapi.client.init({
          discoveryDocs: DISCOVERY_DOCS,
          clientId: CLIENT_ID,
          scope: SCOPES
        }).then(function () {
          // Listen for sign-in state changes.
          gapi.auth2.getAuthInstance().isSignedIn.listen(updateSigninStatus);

          // Handle the initial sign-in state.
          updateSigninStatus(gapi.auth2.getAuthInstance().isSignedIn.get());
          authorizeButton.onclick = handleAuthClick;
          signoutButton.onclick = handleSignoutClick;
        });
      }

      /**
       *  Called when the signed in status changes, to update the UI
       *  appropriately. After a sign-in, the API is called.
       */
      function updateSigninStatus(isSignedIn) {
        if (isSignedIn) {
          authorizeButton.style.display = 'none';
          signoutButton.style.display = 'block';
          listFiles();
        } else {
          authorizeButton.style.display = 'block';
          signoutButton.style.display = 'none';
        }
      }
 /**
       * Print files.
       */
      function listFiles() {
        gapi.client.drive.files.list({
          'pageSize': 10,
          'fields': "nextPageToken, files(id, name)"
        }).then(function(response) {
          appendPre('Files:');
          var files = response.result.files;
          if (files && files.length > 0) {
            for (var i = 0; i < files.length; i++) {
              var file = files[i];
              appendPre(file.name + ' (' + file.id + ')');
            }
          } else {
            appendPre('No files found.');
          }
        });
      }

如果你檢查代碼, initClient()調用一個函數updateSigninStatus這也叫listFiles()在您的驅動器打印的可用文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM