同时通过http在Meteor和第三方服务中创建用户

时间:2015-09-19 00:18:34

标签: api meteor methods

我有一个非常复杂的互动,我只是不知所措。

我的应用程序允许用户注册帐户。当他们注册时,我打电话给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:对象#没有方法'注销'”

2 个答案:

答案 0 :(得分:0)

让我们先从奖励积分开始。您正在寻找的是类似于两阶段提交。两个不同的数据库需要同步。由于您无法控制其中一个,因此您需要小心调用它们的顺序。例如,如果wceapi.org不允许您删除用户,那么您需要在之后创建一个用户你在Meteor中创建了一个用户。让我们假设情况就是这样,因为那是你发布的模式。

所以让我们从:

开始
  1. 在Meteor中创建用户。
  2. 成功创建Meteor用户后,使用HTTP.call
  3. 在wceapi.org中创建用户
  4. 如果wceapi.org失败,删除 Meteor用户。您可以在回调失败的情况下在服务器上执行此操作:

    Meteor.users.remove({ _id: Meteor.userId() });
    
  5. 其次,您不需要在客户端上更新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)一段时间后再次击中他们,或通过回调解决承诺