我正在尝试从 Heroku 上运行的节点.js应用程序更新解析数据库中的 PFUser。我正在从 iOS 应用程序调用 Parse 云函数。
这是我用来在解析时更新用户以及在 Stripe 上创建用户的代码部分(Stripe 部分工作正常):
Parse.Cloud.define("createCustomerWithCreditCardToken", function(request, response) {
var userId = request.user.id;
var sourceId = request.params.creditCardToken;
var customerId;
var userSessionToken = request.user.getSessionToken();
console.log('userId: ' + userId + ' source: ' + sourceId + ' userSessionToken: ' + userSessionToken);
stripe.customers.create({
source: sourceId,
description: userId
}, function(error, customer) {
if (error !== null) {
response.error('error creating customer: ' + error);
}else {
var userQuery = new Parse.Query('User');
userQuery.equalTo('objectId', userId);
userQuery.first({sessionToken: userSessionToken}).then(function(user) {
console.log('user from parse query: ' + user.get("username"));
user.set("stripeCustomerId", customer.id);
user.save(null, {
success: function(parseCustomer) {
console.log('customer saved to parse: ' + parseCustomer);
},
error: function(error, parseCustomer) {
console.log('customer save failed: ' + JSON.stringify(error, null, 2) + ' with error: ' + JSON.stringify(parseCustomer,null, 2));
}
});
});
customerId = customer.id;
console.log('customerId: '+ customerId);
// response.success(customer);
response.success('Customer: ' + JSON.stringify(customer, null, 2) + 'error: ' + error);
}
});
});
运行此程序时,我得到以下错误日志输出:错误日志输出
error: { "code": 206, "message": "Parse::UserCannotBeAlteredWithoutSessionError" }
在这篇文章中,Parse工程师讨论了节点.js应用程序上下文中的当前用户概念。
同样在云代码中,返回当前 用户是有意义的,就像它在网页上的JavaScript中一样,因为 只有一个活动请求和一个用户。然而在一个 上下文 像 node.js,不可能有全局当前用户,这 需要显式传递会话令牌。
从本质上讲,他建议这样做:
Parse.Cloud.define('findBacon', function(req, res) {
var token = req.user.getSessionToken();
var query = new Parse.Query('Bacon');
// Pass the session token to the query
query.find({ sessionToken: token }).then( ... );
});
我也尝试使用{useMasterKey:true}
而不是产生相同错误的{sessionToken:userSessionToken}
。
我可能只是错过了一些明显的细节,但我似乎找不到它。非常感谢有关如何解决此问题的任何想法。
事实证明,还有第三种处理凭据的方法:
Parse.Cloud.useMasterKey();
我把这一行放在整个方法的开头,这对我来说是这样做的。不过,我不确定为整个函数提供这些凭据的含义。
我也不确定您何时会使用其他选项。
如果有人遇到这种情况并想详细说明,我很乐意给出正确的答案,以很好地解释何时授予哪些凭据。