流星法在不为空时抛出$set empty错误

问题描述 投票:0回答:1

我有一个方法是用来改变用户角色的。我的应用程序使用 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.logchangeRole 方法输出正确的(非空)数据,就像这样。

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. 有趣的是,该方法工作了!,角色也改变了,但错误依然存在,我毫无头绪。帮忙!

reactjs mongodb meteor alanning-roles
1个回答
0
投票

我已经检查了 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方法。可能不行,我没有测试。只是猜测。

© www.soinside.com 2019 - 2024. All rights reserved.