当我的点击处理程序在客户端上调用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控制台中。
答案 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