MeteorJS:从用户更新获得成功回调?

时间:2017-04-22 20:25:14

标签: mongodb meteor

所以,我只是想知道我的用户更新是否在客户端上成功,因此我可以通知用户该更新有效。

//Client Side
return Meteor.call('handleUpdateUser', _id, _username, function(err, res) {
  if (err) {
    // also, what is best practices for handling these errors?
  }
  console.log(res);
});

//Server Side
Meteor.methods({
  handleUpdateUser(id, username) {
    if (check for user...) {
      return if found
    }
    return Meteor.users.update({_id: id}, {$set: {username: username}}, 
    function(err, count, res) {
      if (err) {
        console.log(err) // again, best practices for handling these errors?
      }
      return res;
    });
 }

我目前在客户端的控制台中获得undefined

permissions.js:

//Server Side
Meteor.users.allow({
  update:function(userId, doc, fields, modifier) {
    return userId && doc._id === userId;
  }
});

思想?

2 个答案:

答案 0 :(得分:2)

您未定义,因为您的服务器端方法是异步的,如果没有这样处理,您的客户端将看到同步部分的结果。即在handleUserUpdate()的末尾返回隐式undefined。

我使用Future将其视为异步。 e.g。

const Future = Npm.require('fibers/future');

Meteor.methods({
    handleUpdateUser(id, username) {
        let future = new Future();

        Meteor.users.update({_id: id}, {$set: {username: username}}, function(err, res) {
            if (err) {
                console.log(err);
                future.throw(new Meteor.Error('500', err));
            }

            future.return(res);
        });

        return future.wait();
    }
});

现在,Meteor将等待通知客户,直到通过返回或投掷处理未来。您的客户呼叫应该按预期工作。

答案 1 :(得分:0)

来自文档:https://docs.meteor.com/api/collections.html#Mongo-Collection-update

  

在服务器上,如果您不提供回调,则更新阻止   直到数据库确认写入,否则抛出异常   有些不对劲。如果确实提供了回调,则返回更新   立即。更新完成后,将使用a调用回调   失败时的单个错误参数,或第二个参数   如果更新,则指示受影响的文档的数量   成功的。

因此,如果您想等待结果,您应该将update视为同步操作,以避免所有这些期货:

Meteor.methods({
    handleUpdateUser(id, username) {
        return Meteor.users.update({ _id: id }, { $set: { username: username } });
    }
});

如果操作失败,则会抛出错误并将其传递给客户端。如果成功,则返回结果。

如果要检查错误是什么(在服务器端),请将其包装到常规try {} catch(e) {}