Javascript 为什么这里需要FB.getLoginStatus?

Javascript 为什么这里需要FB.getLoginStatus?,javascript,facebook,facebook-graph-api,facebook-authentication,Javascript,Facebook,Facebook Graph Api,Facebook Authentication,我一直致力于将Facebook登录与我的网站整合,到目前为止,我大部分都取得了成功;然而,我仍然没有多少疑问 在我的主页上;我有一个按钮aa href,它将触发一个Javascript函数,用一个弹出窗口提示用户登录Facebook;如果是第一次,用户将收到另一个弹出窗口的提示,询问权限 用户登录(并接受权限)后;(s) 他将使用document.location.href重定向到另一个页面;到目前为止,一切都很顺利。但是,我接下来要做的是: 我想-在加载用户重定向到的页面时-显示欢迎消息(欢迎

我一直致力于将
Facebook登录
与我的网站整合,到目前为止,我大部分都取得了成功;然而,我仍然没有多少疑问

在我的主页上;我有一个按钮a
a href
,它将触发一个Javascript函数,用一个弹出窗口提示用户登录Facebook;如果是第一次,用户将收到另一个弹出窗口的提示,询问权限

用户登录(并接受权限)后;(s) 他将使用
document.location.href
重定向到另一个页面;到目前为止,一切都很顺利。但是,我接下来要做的是:

我想-在加载用户重定向到的页面时-显示欢迎消息(欢迎[电子邮件])-然后我想根据附加到用户名的一些数据库信息动态生成一些元素

我正试图用Javascript实现这一点:

<script>
$('document').ready(function(){

window.fbAsyncInit = function() {
    FB.init({
    appId   : '[my app id]',
    oauth   : true,
    status  : true, // check login status
    cookie  : true, // enable cookies to allow the server to access the session
    xfbml   : true // parse XFBML
    });

    $(document).trigger('fbload');
};

$(document).on('fbload', function(){
    FB.getLoginStatus(function(response) {
        if (response.status === 'connected') {
            FB.api('/me', function(response) {
            user_email = response.email; //get user email
            // Here, I can display the welcome message :)
            });
        } else if (response.status === 'not_authorized') {
            // the user is logged in to Facebook,
            // but has not authenticated your app
        } else {
            // the user isn't logged in to Facebook.
            }
        });
    });
});
</script>
我为
用户电子邮件
获得以下输出:

未定义

我似乎无法理解其中的逻辑!因为
FB.getLoginStatus
只检查用户是否登录;为什么它(或缺少它)会中断函数调用
FB.api

如果有人能解释一下这里实际发生的事情的逻辑,我将不胜感激

注意:不管怎样,我最终可能会使用FB.getLoginStatus,但我主要关心发生的事情的逻辑

您的FB.api('/me',function(response){函数如果没有由FB.getLoginStatus(function(response){函数提供的活动访问令牌,将无法工作

通过将代码更改为以下内容,可以在浏览器控制台中看到:

    $(document).on('fbload', function(){
        FB.getLoginStatus(function(response) {
            console.log(response);  //CHANGE
                FB.api('/me', function(response) {
                    user_email = response.email; //get user email
                    console.log(response);  //CHANGE
                });
            });
        });

这是因为FB.api('/me',函数(response){正在询问关于当前FB用户的各种数据(姓名、性别、家乡、教育程度、用户名、引号……),所以Facebook只是确保你让该用户登录到你的应用程序。

但不是
user\u email=response中的
response
。email
来自
response
这里:
FB.api('/me',函数(response).
?对不起,你完全正确。真正的答案是:你的FB.api('/me',函数(response){如果没有FB.getLoginStatus提供的活动访问令牌,则无法工作。您可以在浏览器控制台中通过使用:$(document).on('fbload',function(){FB.getLoginStatus(function(response){console.log(response);FB.api('/me',function(response))更改代码来仔细检查这一点{user_email=response.email;//获取用户电子邮件控制台.log(response);});});谢谢;我仍然有兴趣知道FB.getLoginStatus提供的
是如何实际发生的?我没有看到
FB.api
FB.getLoginStatus
中获取任何参数,我想在这一部分得到一些澄清!使用我在编辑的答案中提供的代码来检查第一个和第二个问题响应。您应该看到第一个响应包含userId、accessToken、signedRequest和expiresIn。我猜FB.api正在使用浏览器中存储的userId和accessToken,并对照Facebook的数据库检查一致性。您还可以删除FB.getLoginStatus(和first console.log(响应),并查看控制台中的错误消息,其中显示:“必须使用活动访问令牌来查询有关当前用户的信息。”谢谢:)-我仍然对浏览器中存储的
部分感兴趣!我希望有人澄清(并确认)这一点;以及它是如何工作的!
    $(document).on('fbload', function(){
        FB.getLoginStatus(function(response) {
            console.log(response);  //CHANGE
                FB.api('/me', function(response) {
                    user_email = response.email; //get user email
                    console.log(response);  //CHANGE
                });
            });
        });