为什么这个更新失败了?这是基本的,我已经做过很多次了。
Meteor.users.update(id, {$set: {lastname: "Archer"}});
上面的查询甚至已经从最初的查询简化了,它仍然存在同样的问题。最初我是以编程方式编译更新:
console.log(obj);
console.log(id);
if (obj) collection.update(id, obj);
以下是这些行的确切输出:
Object {$set: Object}
$set: Object
lastname: "Archer"
__proto__: Object
__proto__: Object
main.js?b9104f881abb80f93da518738bf1bfb4cab0b2b6:68
YXeudfnHyKmsGXaEL
main.js?b9104f881abb80f93da518738bf1bfb4cab0b2b6:69
update failed: MongoError: invalid query
debug.js:41
id
是正确的,如果obj
有问题,那对我来说就是新闻!
现在,我非常肯定这与我的allow
功能无关。在我的程序的这一部分的第一次测试中,我实际上做了得到了update not allowed
(或者它是什么)错误,但我修改了我的allow
函数以将其带入帐号,这个错误就消失了。
这是我的allow
功能。我有一个用户系统,用户可以在其中拥有一个“镜像”其名称信息的学生对象,因此增加了复杂性。该部分功能仅在某些情况下使用,并且不会改变津贴的行为。
Meteor.users.allow({
update: function (userId, doc, fields, modifier) {
var allow = (userId && (doc._id === userId) && _.without(fields,
'firstname', 'lastname', 'student_ids', 'payment_ids', 'phones').length == 0) || Meteor.user().admin;
if (allow && modifier.$set && (_.contains(fields, 'firstname') || _.contains(fields, 'lastname'))) {
var user = Meteor.users.findOne(userId);
var obj = {};
if (modifier.$set.firstname) obj.firstname = modifier.$set.firstname;
if (modifier.$set.lastname) obj.lastname = modifier.$set.lastname;
if (obj) Students.update({_id: {$in: user.student_ids}, reflectsUser: true}, {$set: obj});
}
return allow;
}
});
答案 0 :(得分:1)
事实证明我的allow
函数是的问题,但有点偷偷摸摸。
Meteor.users.update
电话实际上不是那个失败的电话,就是这个电话:
Students.update({_id: {$in: user.student_ids}, reflectsUser: true}, {$set: obj});
我没有正确检查user.student_ids
字段,因此如果是undefined
(该用户没有任何学生)则查询无效。投掷一条线来审核那个阵列:
var student_ids = user.student_ids || [];
解决了这个问题。
由于Meteor错误没有告诉我哪个查询无效,这让我有点疯狂追逐。只是表明好的错误可以走很长的路!
此外,执行具有其他数据库查询作为副作用的数据库查询是非常谨慎的事情。