Javascript - API и функции Google Drive v3 - PullRequest
0 голосов
/ 06 сентября 2018

Попытка создать соединение с API Google Drive v3 с помощью JavaScript SDK.

По сути, конечная цель, которую я хочу достичь, - получить доступ к различным файлам с google-диска и добавить метаданные (но пока не очень далеко).

Пробежался по учебнику на руководствах по google drive (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», как я это делал в полном примере.

Но это дает 'undefined' при вызове переменной и при выполнении '.then':

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

Невозможно получить свойство 'then' с неопределенной или нулевой ссылкой

Что я делаю не так? Очевидно, что-то, возможно, что-то действительно глупое = [

Любая помощь будет принята с благодарностью =]

1 Ответ

0 голосов
/ 07 сентября 2018

Я попробовал твой код, он работает на моей стороне. После аутентификации вам больше не нужно звонить 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


UPDATE

Если вы имеете в виду функции, вызываемые внутри функции для 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(), которая печатает доступные файлы на вашем диске.

...