我有一个方法是用来改变用户角色的。我的应用程序使用 alanning:roles
来管理权限。这个方法是这样定义的。
/* 8. changeRole */
'changeRole'({id, oldrole, newrole}){
console.log('id:',id)
console.log('oldrole:',oldrole)
console.log('newrole:',newrole)
new SimpleSchema({
id : { type : String },
oldrole : { type : String },
newrole : { type : String }
}).validate({id, oldrole, newrole})
if (Roles.userIsInRole(this.userId, ['superuser'])) {
Roles.removeUsersFromRoles(id, oldrole)
Roles.createRole(newrole, {unlessExists: true});
Roles.addUsersToRoles(id, newrole)
UserProfiles.update({
owner : id,
},{
$set : {
roles: [newrole]
}
})
Meteor.users.update({
_id : id,
},{
$set : {
roles : [newrole]
}
})
return true;
} else {
throw new Meteor.Error('not-authorised!');
}
}
...而这个方法在前端被调用,通过这个调用。
handleChangeRole = (id, oldrole) => {
let newrole = theRole;
/* console.log('submitting these values', owner, oldrole, newrole) */
if(!Meteor.userId){
message.error('You are not authorised to do that!');
} else {
Meteor.call('changeRole',{ id, oldrole, newrole }, function(err, result){
if(!result){
message.error('Failed to change role for this user');
} else {
message.success('User has been successfully assigned a new role')
setToggleData(!toggleData);
}
})
}
}
当这个方法被测试时,就会产生错误信息 Failed to change role for this user
在前端和服务器控制台都出现了这个错误。Exception while invoking method 'changeRole' MongoError: '$set' is empty. You must specify a field like so: {$set: {<field>: ...}}
该 console.log
在 changeRole
方法输出正确的(非空)数据,就像这样。
I20200610-13:32:55.852(8)? id: MnBDne4ge62RMLFAH
I20200610-13:32:55.852(8)? oldrole: student
I20200610-13:32:55.852(8)? newrole: teacher
我找不到为什么在数据存在的情况下,会抛出错误的$set is empty. 有趣的是,该方法工作了!,角色也改变了,但错误依然存在,我毫无头绪。帮忙!
我已经检查了 alanning:roles
源码
addUsersToRoles: function (users, roles, options) {
if (!users) throw new Error('Missing \'users\' param.')
if (!roles) throw new Error('Missing \'roles\' param.')
options = Roles._normalizeOptions(options)
// ensure arrays
if (!Array.isArray(users)) users = [users]
if (!Array.isArray(roles)) roles = [roles]
那么它可能会改变角色的输入值。newrole
变量是一个字符串,调用该函数后,它将是一个数组。然后你用数组的$set调用update方法。可能不行,我没有测试。只是猜测。