我正在开发一个Meteor应用程序,我正在构建的功能之一是一个表单,它将一个新文档插入到一个数组中(在用户的配置文件中插入一个送货地址,其中一个用户可以有多个地址)。我一直得到的错误是:

Exception while invoking method 'addAddress' Error: When the modifier option is true, validation object must have at least one operator

我一直试图找出stackoverflow、github等问题的答案,但没有找到解决方案。我现在想了解错误的确切含义——所以我的问题是MongoDB中的修饰符选项和运算符到底是什么?据我所知,修饰符对从查询返回的数据类型提供约束,而运算符用于修改数据。这些定义正确吗?
有人知道我犯的错误是什么意思吗?这是我的示例代码:
我的单击事件捕获表单上的数据并调用方法添加地址:
Template.editAddress.events({

'click .addAddress': function(e, tmpl) {
e.preventDefault();
var currentUserId = Meteor.userId();
console.log(currentUserId);
var addressDetails = {
  address: {
    streetAddress: $('#streetAddress').val()
  }
};
console.log(addressDetails);
Meteor.call('addAddress', addressDetails, currentUserId, function(error) {
  if (error) {
    alert(error.reason);
  } else {
    console.log('success!');
    Router.go('Admin');
  }
});

}
(});
我插入地址的方法:
Meteor.methods({
'addAddress': function(addressDetails, currUserId) {

    var currentUserId = currUserId;

    console.log('user to add address to is ' + currUserId);

    Meteor.users.update(currentUserId, {$addToSet:
        {
            'address.streetAddress': addressDetails.streetAddress
        }
      });
    }

(});
请注意,当我在控制台中键入该查询时,它可以工作:
db.users.update({_id: 'Qdf89k3fd93jfdk'}, {$addToSet: {'address.streetAddress': '12345 fake st'}});

提前谢谢你!

最佳答案

addressDetails对象没有字段,因此streetAddress返回addressDetails.streetAddress。在更新中改用undefined。而且,正如joshua指出的那样,使用对象作为带有addressDetails.address.streetAddress的选择器。所以整个功能应该是:

Meteor.users.update( { _id: currentUserId }, {$addToSet:
    {
        'address.streetAddress': addressDetails.address.streetAddress
    }
  });
}

还有一件事,你不应该从客户端传递用户id。您定义的任何方法都可以从客户端调用,这样,我就可以从浏览器控制台用任何用户id调用您的方法来更新它们的地址。相反,在方法调用中使用{ _id: currUserId }对象(请参见here)并检查它是否'addAddress',即用户已登录。
if (! this.userId)
  throw new Meteor.Error(401, "You must be logged in!");
var currentUserId = this.userId;

09-25 22:24