2015-04-07 123 views
3

我正在使用云功能来获取用户的sessionToken。该文件说,这个方法只有在用主键获取用户对象时才返回正确的值。但是,即使我使用主密钥,我仍然会得到未定义的结果。我的代码有什么问题?解析 - 为什么user.getSessionToken()返回undefined

Parse.Cloud.define("hello", function(request, response) { 
    Parse.Cloud.useMasterKey(); 
    Parse.Promise.as().then(function(){ 
     var query = new Parse.Query(Parse.User); 
     return query.first({useMasterKey:true}); 
    }).then(function(user){ 
     return user.fetch({useMasterKey:true}); 
    }).then(function(user){ 
     response.success(user.getSessionToken()); 
    }); 
}); 
+1

您的用户是否有'useMasterKey'键?从用户的角度来看,您的实际目标是什么(谁使用这种云功能以及用于什么)? – Wain

回答

6

这将无法正常工作,因为用户通过云代码获取他时未登录。为了getSessionToken的工作,你需要已经有一个登录用户。因为,否则CloudCode会如何知道您想要获得哪个用户会话? (如果他登录了多个设备)另外你的代码正在返回数据库中的第一个用户,这真的是你想要的吗?

无论哪种方式,您都需要通过云代码登录用户,然后返回会话令牌。然而,我没有密码(在调用user.logIn()时遇到了一些麻烦),它应该工作,所以试试看),所以我找到的唯一解决方案是更改用户的密码,然后登录。你需要获取用户的会话令牌吗?如果您不介意更改用户的密码,您可以执行如下操作:

var password; //create new random passowrd 
query.first({useMasterKey: true}).then(function(user){ 
    user.set("password", password); 
    return user.save(); 
}).then(function(user){ 
    return Parse.User.logIn(user.get("username"), password); 
}).then(function(user){ 
    return user.getSessionToken(); 
}); 
+0

问题中的代码只是一个演示。我的目标是进行第三方登录,在这种情况下密码是随机生成的。根据文档,如果我使用主密钥获取用户,即使用户没有登录,getSessionToken()也应该可以工作。我想我可能会触发一个解析错误。因为在另一个应用程序它正常工作。 –

+0

是的,它曾经像那样工作。但是,如果您将解析sdk升级到版本1.4,并添加Parse.Session,则停止为我工作。我不知道它是否是一个错误。我还必须建立第三方登录,如果你想在https://github.com/felix-dumit/PFUser-Digits查看js代码。 –

+0

虽然这个解决方案看起来很诡异,但它的作用就像一个魅力。我在sdk 1.4.2上。 – Kartik