`未捕获的类型错误:无法读取未定义的属性‘signOut’`
我收到错误:
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
被调用(我自己没有明确执行)并且失败了,发生了什么这里?
我已经在这里检查过了:
- TypeError:gapi.auth2 未定义
- gapi 未定义 - 使用 gapi.auth2.init 的 Google 登录问题
- HTML PHP google 单点登录退出将抛出“无法读取属性‘getAuthInstance’ undefined"
- 如何使用“Google 登录”(OAuth 2.0)检查用户是否登录
更新 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);
});
});
}
});
您的 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);
});
});
}
您的问题很可能是由于您的代码在定义
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');
});
}
});
}
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。