我有一个非常复杂的互动,我只是不知所措。
我的应用程序允许用户注册帐户。当他们注册时,我打电话给Meteor方法,该方法也使用他们的注册详细信息在外部应用程序上使用API注册帐户。 (单点登录)。
我的问题是,外部API返回一个ID,我需要与我的数据库中的用户关联。
我不知道该怎么做。
这是我的代码
客户端注册码:
Template.register.events({
'submit #signUpForm': function(e, t) {
e.preventDefault();
var signUpForm = $(e.currentTarget),
forename = trimInput(signUpForm.find('#forename').val()),
surname = trimInput(signUpForm.find('#surname').val()),
email = trimInput(signUpForm.find('#signUpEmail').val().toLowerCase()),
password = signUpForm.find('#signUpPassword').val(),
passwordConfirm = signUpForm.find('#signUpPasswordConfirm').val();
profile = {forename: forename, surname: surname};
if (isNotEmpty(email) && isNotEmpty(password) && isEmail(email) && areValidPasswords(password, passwordConfirm)) {
Accounts.createUser({email: email, password: password, profile: profile}, function(err) {
if (err) {
if (err.message === 'Email already exists. [403]') {
console.log('We are sorry but this email is already used.');
} else {
console.log('We are sorry but something went wrong.');
}
} else {
console.log('Congrats new Meteorite, you\'re in!');
Meteor.call('createUser', email, forename, surname); //registers user on external app using API
Router.go('/');
}
});
}
return false;
},
});
这是我正在使用的方法
Meteor.methods({
'createUser': function(email, forename, surname) {
var endPoint = "/user"
HTTP.call( verb, 'http://sandbox.wceaapi.org/v1.1'+ endPoint, {
headers: {
"Request-Time": timeStamp,
"Api-Key": key,
"Signature": hash
},
data: {
"email": email,
"name": forename,
"surname": surname
}
}, function( error, response ) {
if ( error ) {
console.log( error );
} else {
console.log( response );
var result = JSON.parse(response.content);
var id = result.records.id;
console.log(id); //this ID is what I want to then pass back to client and attach to the new user in the database.
}
});//end function error response
}// end createUser
});//end method
我正在从API检索的ID变量是我想要附加到新用户帐户的ID。我不知道该怎么做。
奖励积分目前,即使在远程服务器上失败,我的网站上也会注册用户帐户。如果出现问题,如何才能使用户帐户未注册?对于像我这样的新手来说,这是一个非常复杂的互动,所以非常感谢你的帮助。
谢谢
修改
按照迈克尔的建议 - 我添加了一个回调,如果外部API注册失败,我会将用户注销,然后从我的数据库中删除它们。这不行。此外,外部API允许我删除用户,我已经创建了一个方法,但我只是不知道如何在客户端调用该方法,然后根据它是否成功继续用户注册或不 - 所以我决定按照迈克尔建议的顺序这样做。
这是更新的代码(忽略他们用于测试的console.log)
Meteor.methods({
'createWceaUser': function(email, forename, surname) {
var endPoint = "/user";
HTTP.call( verb, 'http://sandbox.wceaapi.org/v1.1'+ endPoint, {
headers: {
"Request-Time": timeStamp,
"Api-Key": key,
"Signature": hash
},
data: {
"email": email,
"name": forename,
"surname": surname
}
}, function( error, response ) {
if ( error ) {
console.log(error);
Meteor.logout();
Meteor.users.remove({ _id: Meteor.userId() });
} else {
console.log( response );
var result = JSON.parse(response.content);
var id = result.records.id;
console.log(id);
Meteor.users.update({ _id: Meteor.userId() }, { $set: { 'profile.wceaId': id }});
}
});//end function error response
}// end createWceaUser
});//end method
我得到的错误是“异步函数回调中的异常:TypeError:对象#没有方法'注销'”
答案 0 :(得分:0)
让我们先从奖励积分开始。您正在寻找的是类似于两阶段提交。两个不同的数据库需要同步。由于您无法控制其中一个,因此您需要小心调用它们的顺序。例如,如果wceapi.org不允许您删除用户,那么您需要在之后创建一个用户你在Meteor中创建了一个用户。让我们假设情况就是这样,因为那是你发布的模式。
所以让我们从:
开始HTTP.call
如果wceapi.org失败,删除 Meteor用户。您可以在回调失败的情况下在服务器上执行此操作:
Meteor.users.remove({ _id: Meteor.userId() });
其次,您不需要在客户端上更新Meteor用户文档中的wceapi.org id,只需在回调的成功条件下直接在服务器上执行:
Meteor.users.update({ _id: Meteor.userId() },{ $set: { wceapiId: id }});
或
Meteor.users.update({ _id: Meteor.userId() },{ $set: { 'profile.wceapiId': id }});
如果要将wceapiID存储在用户文档的配置文件部分中。它的优点是它会自动发布给客户端。如果您在用户文档中创建了它自己的根级别密钥,那么您必须从服务器发布它并从客户端订阅它。由于你是新手,请使用个人资料子键。
答案 1 :(得分:0)
1)webhooks-如果你为他们注册了一个webhook网址,那么api会给你回电话,你可以轻松地在流星上使用你的路由器。
2)一段时间后再次击中他们,或通过回调解决承诺