-1

我正在尝试连接到 Google Drive API,但我不断收到返回“未捕获的类型错误:无法读取 initClient 处未定义的属性‘init’。”

我不知道该怎么做才能解决这个问题。

这是我正在运行的代码:

       `enter code here`var CLIENT_ID = ' ';
        var API_KEY = ' ';          
        // Array of API discovery doc URLs for APIs used by the quickstart
        var DISCOVERY_DOCS = ["https://www.googleapis.com/discovery/v1/apis/drive/v3/rest"];
  
        // Authorization scopes required by the API; multiple scopes can be
        // included, separated by spaces.
        var SCOPES = 'https://www.googleapis.com/auth/drive.readonly';
  
        
  
        var FILES = {};
  
        function handleClientLoad() {
            setTimeout(function(){ gapi.load('client', initClient()); }, 3000);
        }
  
        function initClient() {
            gapi.client.init({
                apiKey: API_KEY,
                clientId: CLIENT_ID,
                discoveryDocs: DISCOVERY_DOCS,
                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();
            }, function(error) {
                console.log(JSON.stringify(error, null, 2));
            });
            
            return gapi;
        }

我按照建议更改了它,但它仍然无法正常工作。我不确定我做错了什么!这是更新的代码:

`enter code here`var CLIENT_ID = ' ';
        var API_KEY = ' ';          
        // Array of API discovery doc URLs for APIs used by the quickstart
        var DISCOVERY_DOCS = ["https://www.googleapis.com/discovery/v1/apis/drive/v3/rest"];
  
        // Authorization scopes required by the API; multiple scopes can be
        // included, separated by spaces.
        var SCOPES = 'https://www.googleapis.com/auth/drive.readonly';
  
        
  
        var FILES = {};
  
        function handleClientLoad() {
            setTimeout(function(){ gapi.load('client:auth2', initClient); }, 3000);
        }
  
        function initClient() {
            gapi.client.init({
                apiKey: API_KEY,
                clientId: CLIENT_ID,
                discoveryDocs: DISCOVERY_DOCS,
                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();
            }, function(error) {
                console.log(JSON.stringify(error, null, 2));
            });
            
            return gapi;
        }

还有其他建议吗?谢谢!

4

1 回答 1

1

gapi.load 接受一个回调函数,但您将 initClient() 的输出传递给它。

其次,您需要加载 OAuth2 库 (auth2)。

请参阅参考文档

改变这个:

function handleClientLoad() {
  setTimeout(function() { gapi.load('client', initClient()); }, 3000);

对此:

function handleClientLoad() {
  setTimeout(function() { gapi.load('client:auth2', initClient); }, 3000);

PS。如果您将代码放在问题的文本中,而不是屏幕截图中,其他人更容易剪切粘贴答案。

于 2021-03-16T02:29:32.117 回答