开发者问题收集

`未捕获的类型错误:无法读取未定义的属性‘signOut’`

2021-07-18
2190

我收到错误:

Uncaught TypeError: Cannot read property 'signOut' of undefined

在此行: auth2.signOut()

下面的页面上没有 Google 登录按钮。 我也尝试执行函数 signOutGoogle ,但这也会导致错误。

页面顶部的 <head> 中我的页面:

<meta name="google-signin-scope" content="profile email">
<meta name="google-signin-client_id" content="MYAPPIDPLACEHOLDERWHICHIFILLEDOUT.apps.googleusercontent.com">

</body> 标签之前我有:

<script src="https://apis.google.com/js/platform.js?onload=onLoad" async defer></script>

JavaScript 代码:

function onLoad() {
    console.error('onLoad executed.');
    var auth2;
    gapi.load('auth2', function () {
        auth2 = gapi.auth2.init({
           client_id: 'MYAPPIDPLACEHOLDERWHICHIFILLEDOUT.apps.googleusercontent.com'
        });
        auth2 = gapi.auth2.getAuthInstance();
    });  
           
    //check if url contains ?signout=true
    var url = window.location.href;
    if (url.toString().indexOf('?signout=true') != -1) {
        console.error('param found');

        auth2.signOut().then(function () {
            console.error('User signed out');
        });
    }
}

更新 1

在此处输入图像描述

由于某种原因, ga 被调用(我自己没有明确执行)并且失败了,发生了什么这里?

我已经在这里检查过了:

更新 2

现在我收到错误

Uncaught Error: ia

在此处输入图片说明

更新 3

我尝试从脚本调用中删除对 noload 的调用,然后将其添加到 document.ready 然后调用 signout 函数,但即使使用 @Vishal 的代码,API 也不可用:

<script src="https://apis.google.com/js/platform.js"></script></body>

并且:

$(document).ready(function () {
        var url = window.location.href;
        if (url.toString().indexOf('?signout=true') != -1) {
            console.error('onLoad executed.');
            var auth2;
            gapi.load('auth2', function () {
                auth2 = gapi.auth2.init({
                    client_id: 'MYAPPIDPLACEHOLDERWHICHIFILLEDOUT.apps.googleusercontent.com'
                }).then(() => {
                    auth2 = gapi.auth2.getAuthInstance();
                    auth2.signOut().then(function () {
                        console.error('User signed out');
                    });
                }).catch(err => {
                    console.log(err);
                });
            });
        }
    });
3个回答

您的 javascript 代码应如下所示,并且在代码中,我在 init 操作的 then() 部分添加了注销执行。因此,只有在 init 返回服务器响应后,才会执行注销代码。

function onLoad() {
    console.error('onLoad executed.');
    var auth2;
    gapi.load('auth2', function () {
        auth2 = gapi.auth2.init({
           client_id: 'MYAPPIDPLACEHOLDERWHICHIFILLEDOUT.apps.googleusercontent.com'
        }).then(() => {
           auth2 = gapi.auth2.getAuthInstance();
           //check if url contains ?signout=true
           var url = window.location.href;
           if (url.toString().indexOf('?signout=true') != -1) {
              console.error('param found');

              auth2.signOut().then(function () {
                   console.error('User signed out');
              });
            }
         }).catch(err => {
             console.log(err);
         });
        
    });
}
Vishal P Gothi
2021-07-26

您的问题很可能是由于您的代码在定义 auth2 变量之前调用了 signOut 函数。根据您的代码,来自 gapi.load 的回调不会立即执行,并且由于 JavaScript 已编译,因此

var url = window.location.href;
if (url.toString().indexOf('?signout=true') != -1) {
    console.error('param found');

    auth2.signOut().then(function () {
    console.error('User signed out');
    });
}

代码的这一部分在 auth2 仍为 未定义 时被调用。尝试将其放入回调中,如下所示:

function onLoad() {
    console.error('onLoad executed.');
    var auth2;
    gapi.load('auth2', function () {
        auth2 = gapi.auth2.init({
           client_id: 'MYAPPIDPLACEHOLDERWHICHIFILLEDOUT.apps.googleusercontent.com'
        });
        auth2 = gapi.auth2.getAuthInstance();
           
        //check if url contains ?signout=true
        var url = window.location.href;
        if (url.toString().indexOf('?signout=true') != -1) {
            console.error('param found');

            auth2.signOut().then(function () {
                console.error('User signed out');
            });
        }
    });
}
ErrorGamer2000
2021-07-20
function onLoad() {
    console.error("onLoad executed.");
    var auth2;

    const oauthLogin = new Promise((resolve, reject) => {
      gapi.load("auth2", function () {
        auth2 = gapi.auth2.init({
          client_id: "MYAPPIDPLACEHOLDERWHICHIFILLEDOUT.apps.googleusercontent.com",
        });
        auth2 = gapi.auth2.getAuthInstance();
      });
    });

    oauthLogin.then(() => {
      if (window.location.href.indexOf("?signout=true") != -1) {
        console.error("param found");
        auth2.signOut().then(function () {
          console.error("User signed out");
        });
      }
    });
  }

您可以将承诺分配给变量,并在像这样解析后执行一些代码。 有多种方法可以实现这一点,请查看 Promise.prototype.then() 参考。

顺便说一句,您不需要将window.location.href解析为String,因为 location.href 是一个字符串生成器,它返回一个适合您目的的USVString。

JoelBonetR
2021-07-26