Javascript Parse.com Facebook API logIn()方法。回调永远不会被调用

Javascript Parse.com Facebook API logIn()方法。回调永远不会被调用,javascript,facebook,parse-platform,facebook-apps,facebook-authentication,Javascript,Facebook,Parse Platform,Facebook Apps,Facebook Authentication,当我的click handler在客户机上调用logIn()函数时,我看到一个FB弹出窗口和一条记录正在用户集合中创建,但从未调用回调方法。相反,我在JS控制台中看到了以下内容 Uncaught TypeError: Cannot read property 'getTime' of null parse-1.2.18.min.js:3 这是我页面上的代码 设置FBAPI <script> window.fbAsyncInit = function() { P

当我的click handler在客户机上调用logIn()函数时,我看到一个FB弹出窗口和一条记录正在用户集合中创建,但从未调用回调方法。相反,我在JS控制台中看到了以下内容

Uncaught TypeError: Cannot read property 'getTime' of null parse-1.2.18.min.js:3
这是我页面上的代码

设置FBAPI

 <script>
    window.fbAsyncInit = function() {
      Parse.FacebookUtils.init({
        appId      : 757503280935086,
        xfbml      : true,
        version    : 'v2.0'
      });
    };

    (function(d, s, id){
       var js, fjs = d.getElementsByTagName(s)[0];
       if (d.getElementById(id)) {return;}
       js = d.createElement(s); js.id = id;
       js.src = "//connect.facebook.net/en_US/sdk.js";
       fjs.parentNode.insertBefore(js, fjs);
     }(document, 'script', 'facebook-jssdk'));
</script>
FB应用程序已启用网站“平台”

下次我试的时候我看到了

Uncaught Error: Setting authResponse is not supported 

在JS控制台中。

注意:由于Facebook修复了API调用以旧字符串格式返回日期,因此不再需要此修复程序(实际上会破坏它)。

Facebook最近添加了2.0版的API,不幸的是他们破坏了解析。特别是Parse使用了一个非常严格的规则来读取Facebook回复中的日期

解决方法是下载parse-1.2.18.js文件,并更新parse.\u parseDate函数,然后将该js文件加载到您的站点中,并更改页面以使用该文件而不是当前版本:

Parse._parseDate = function(iso8601) {
    var regexp = new RegExp(
      "^([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,2})" + "T" +
      "([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})" +
      "(.([0-9]+))?" + "Z$");
将其更新为:

Parse._parseDate = function(iso8601) {
    var iso8601 = iso8601.split(“+”)[0] + “Z”;
    var regexp = new RegExp(
      "^([0-9]{1,4})-([0-9]{1,2})-([0-9]{1,2})" + "T" +
      "([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})" +
      "(.([0-9]+))?" + "Z$");
基本上,它只是从末尾去掉任何“+00:00”,再加上“Z”,这样它就可以再次工作了

您可以使用以下方法使其更加健壮(以防Facebook恢复到旧的日期格式):

var iso8601 = iso8601.split(“+”)[0].split(“Z”)[0] + “Z”;
那样的话,如果“Z”被放回去,我们会在它之前抓住所有的东西,不要打破

Facebook bug追踪器中记录了一个bug,它还显示了一个更新的
regexp
,这两个工具都可以使用,不过我手头没有这个链接

更新:还要确保您使用的是正确版本的API

如果您现在按照Facebook上的说明进行操作,他们希望您有这样一个部分:

(function(d, s, id){
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) {return;}
    js = d.createElement(s); js.id = id;
    js.src = "//connect.facebook.net/en_US/sdk.js";
    fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
window.fbAsyncInit = function() {
    Parse.FacebookUtils.init({
        appId      : yourAppId,
        xfbml      : true,
        version    : 'v1.0'
    });
};
请注意,如果您使用的是
sdk.js
,则需要向init调用传递一个version参数,对于Parse,该参数将如下所示:

(function(d, s, id){
    var js, fjs = d.getElementsByTagName(s)[0];
    if (d.getElementById(id)) {return;}
    js = d.createElement(s); js.id = id;
    js.src = "//connect.facebook.net/en_US/sdk.js";
    fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'facebook-jssdk'));
window.fbAsyncInit = function() {
    Parse.FacebookUtils.init({
        appId      : yourAppId,
        xfbml      : true,
        version    : 'v1.0'
    });
};

我们将显式地将版本设置为1.0,直到Parse更新其代码以处理2.0。

问题来自于使用v2 facebook api

切换到旧版本与蒂莫西的修复工程

    window.fbAsyncInit = function() {
        Parse.FacebookUtils.init({
            appId      : '' // Facebook App ID
        });
    };
    (function(d, s, id){
        var js, fjs = d.getElementsByTagName(s)[0];
        if (d.getElementById(id)) {return;}
        js = d.createElement(s); js.id = id;
        js.src = "//connect.facebook.net/en_US/all.js";
        fjs.parentNode.insertBefore(js, fjs);
    }(document, 'script', 'facebook-jssdk'));

请注意,包括all.js而不是sdk.js

我明白了,我有这个问题是为了感谢Timothy和Peeter,你救了我的命!即使添加了此修复程序,我现在也会出现未捕获错误:登录时不支持设置authResponseproblem@Peeter谢谢,还添加了关于设置版本的说明。@TimothyChanges我认为设置版本没有帮助,至少对我来说没有帮助。