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

Mongodb MeteorJS:从用户更新中获得成功回调?,mongodb,meteor,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 Me

所以,我只想知道我的用户更新是否在客户端成功,这样我就可以通知用户更新成功了

//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;
    });
 }
我当前在客户端的控制台中获得了
未定义的

permissions.js:

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

想法?

由于您的服务器端方法是异步的,如果不这样处理,您的客户机将看到同步部分的结果,因此您将无法定义。i、 e.在handleUserUpdate()末尾返回的隐式未定义

我使用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将等待通知客户机,直到处理好未来,无论是通过返回还是抛出。您的客户端调用应该按照您的预期工作。

由于您的服务器端方法是异步的,如果不这样处理,您的客户端将看到同步部分的结果,因此您的客户端调用没有定义。i、 e.在handleUserUpdate()末尾返回的隐式未定义

我使用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将等待通知客户机,直到处理好未来,无论是通过返回还是抛出。您的客户电话应按预期工作。

来自文档:

在服务器上,如果不提供回调,则更新块 直到数据库确认写入,或者在 出了点问题。如果确实提供了回调,则update将返回 马上。更新完成后,将使用 失败情况下的单个错误参数,或第二个参数 指示更新失败时受影响文档的数量 成功

所以,如果您想等待结果,您应该将
update
看作一个同步操作,以避免所有这些未来:

Meteor.methods({
    handleUpdateUser(id, username) {
        return Meteor.users.update({ _id: id }, { $set: { username: username } });
    }
});
如果操作失败,它将抛出一个错误并将其传递给客户端。如果成功,那么它将返回结果

如果要检查错误是什么(在服务器端),请将其包装成常规的
文件,然后从文档中尝试{}catch(e){}

在服务器上,如果不提供回调,则更新块 直到数据库确认写入,或者在 出了点问题。如果确实提供了回调,则update将返回 马上。更新完成后,将使用 失败情况下的单个错误参数,或第二个参数 指示更新失败时受影响文档的数量 成功

所以,如果您想等待结果,您应该将
update
看作一个同步操作,以避免所有这些未来:

Meteor.methods({
    handleUpdateUser(id, username) {
        return Meteor.users.update({ _id: id }, { $set: { username: username } });
    }
});
如果操作失败,它将抛出一个错误并将其传递给客户端。如果成功,那么它将返回结果


如果您想检查错误是什么(在服务器端),然后将其包装成一个常规的
try{}catch(e){}

,因此,上面的代码仍然是
undefined
。所以我控制台了res,我在服务器上得到了
未定义的
。。。我将回调更改为
(err,res)
,现在我返回
1
,err为
null
。我将使用1作为布尔值向前移动,以在客户端触发一条消息。谢谢你的建议。以前,即使在尝试获取计数时,我也得到了
未定义的
,因此这确实有帮助;我编辑了我的帖子以删除它。是的,通常这样的调用实际上不会返回任何数据,但成功路径表示它已完成并成功。我一直在使用这种模式。因此,我仍然在使用上面的
未定义的
。所以我控制台了res,我在服务器上得到了
未定义的
。。。我将回调更改为
(err,res)
,现在我返回
1
,err为
null
。我将使用1作为布尔值向前移动,以在客户端触发一条消息。谢谢你的建议。以前,即使在尝试获取计数时,我也得到了
未定义的
,因此这确实有帮助;我编辑了我的帖子以删除它。是的,通常这样的调用实际上不会返回任何数据,但成功路径表示它已完成并成功。我一直在用那种模式。