3

当我的点击处理程序在客户端上调用logIn()函数时,我看到一个FB弹出窗口和一个在User集合中创建的记录,但回调方法从不会被调用。相反,我看到在JS控制台Parse.com Facebook API的logIn()方法。回调永远不会被调用

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应用程序已启用网站“平台”。

下一次,我试着在我JS控制台看到

Uncaught Error: Setting authResponse is not supported 

+0

任何喜悦这个我得到太 –

回答

3

问题来自使用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

+0

我有这个问题要感谢蒂莫西和皮特,你已经救了我的培根! –

4

注意:当Facebook修复API调用以旧字符串格式返回日期时,此修复程序不再是必需的(而是实际上将其中断)。

Facebook最近添加了API的v2.0,不幸的是他们破解了Parse。特别是Parse使用非常严格的规则来阅读来自Facebook响应的日期。

一种解决方法是下载语法分析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。

+0

谢谢你,先生! – mkvakin

+0

即使在添加此修复程序后,我现在在登录时得到'未捕获的错误:设置authResponse不受支持 – Abadaba

+0

检查我的答案,应该修复您的问题 – Peeter

相关问题