所以,我只是想知道我的用户更新是否在客户端上成功,因此我可以通知用户该更新有效。
//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;
}
});
思想?
答案 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) {}
。