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

时间:2014-05-06 10:22:50

标签: javascript facebook parse-platform facebook-apps facebook-authentication

当我的点击处理程序在客户端上调用logIn()函数时,我看到一个FB弹出窗口和一个在User集合中创建的记录,但是从不调用回调方法。相反,我在JS控制台中看到以下内容

Uncaught TypeError: Cannot read property 'getTime' of null parse-1.2.18.min.js:3

以下是我页面上的代码

设置FB API

 <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>

调用登录方法

$scope.signupFB = function() {
    Parse.FacebookUtils.logIn(null, {
      success: function(user) {
        //never get here
        $timeout(function() {
            $rootScope.theUser = user;
            $location.path("/properties");
         });
      },
      error: function(user, error) {
        $scope.error = "User cancelled the Facebook login or did not fully authorize.";
      }
    });
  }

FB应用程序启用了一个“平台”网站。

下次我尝试时看到了

Uncaught Error: Setting authResponse is not supported 

在JS控制台中。

2 个答案:

答案 0 :(得分:4)

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

Facebook最近添加了API的v2.0,不幸的是他们打破了Parse。特别是Parse使用非常严格的规则从Facebook回复中读取日期。

解决方法是下载parse-1.2.18.js文件,并更新Parse._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错误跟踪器中记录了一个错误,该错误还显示了可以同时使用的更新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'));

请注意,如果您使用sdk.js,则需要将版本参数传递给init调用,对于Parse,最终会看起来像这样:

window.fbAsyncInit = function() {
    Parse.FacebookUtils.init({
        appId      : yourAppId,
        xfbml      : true,
        version    : 'v1.0'
    });
};

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

答案 1 :(得分:3)

问题来自于使用v2 facebook api。

使用Timothy的修复工具切换到旧版本。

    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