我正在开发一个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;