调用方法'users.insert'时发生异常错误:匹配错误:预期的数组,在字段[0]中获得“ admin”。角色读取项目元数据

时间:2018-11-07 20:08:17

标签: reactjs mongodb meteor

我正在尝试插入用户集合,但出现上述错误。有没有一种方法可以将字段输入数组。期望有一个数组,但我要在我的角色字段中输入admin。如何从UI中将角色插入为数组?

这是Server side,我正在定义所有需要插入的字段。

Meteor.methods({
  "users.insert"(users) {
    check(users, [
      {
        email: String,
        password: String,
        username: String,
        profile: {
          name: { firstname: String, lastname: String },
          phone: String
        },
        roles: [String]
      }
    ]);

    users.forEach(({ email, password, username, profile, roles }) => {
      const userExists = Accounts.findUserByEmail(email);

      if (!userExists) {
        const userId = Accounts.createUser({
          email,
          password,
          username,
          profile
        });
        Roles.addUsersToRoles(userId, roles, "default-group");
      }
    });
  }
});

Client side,初始状态和流星呼叫

this.state = {
      phone: "",
      email: "",
      password: "",
      username: "",
      roles: []
    };

onSubmit(e) {
    e.preventDefault();

    const {
      phone,
      email,
      password,
      username,
      roles
    } = this.state;

    const user = [
      {
        email,
        password,
        username,
        profile: {
          name: { firstname, lastname },
          phone,
        },
        roles
      }
    ];

    this.props.createUser("users.insert", user);
  }

Submission Form,我在这里插入值

<form
          onSubmit={this.onSubmit.bind(this)}
          noValidate
          className="boxed-view__form"
        >
          <input
            className="editor__title editor__title--border"
            type="tel"
            name="phone"
            placeholder="Contact"
            value={this.state.phone}
            onChange={this.onChange}
          />
          <input
            className="editor__title"
            type="email"
            name="email"
            placeholder="Email"
            value={this.state.email}
            onChange={this.onChange}
          />
          <input
            className="editor__title"
            type="password"
            name="password"
            placeholder="Password"
            value={this.state.password}
            onChange={this.onChange}
          />
          <input
            className="editor__title"
            type="text"
            name="username"
            placeholder="username"
            value={this.state.username}
            onChange={this.onChange}
          />
          <input
            className="editor__title"
            type="text"
            name="roles"
            placeholder="Roles"
            value={!this.state.roles}
            onChange={this.onChange}
          />
          <button className="button">Create Account</button>
        </form>

1 个答案:

答案 0 :(得分:2)

尽管您要在状态中将角色初始化为数组,但是在键入输入并将其变成字符串时,您会覆盖此角色。

roles = []

开头

onChange函数中,您将状态下的roles设置为字符串admin

我们将略微更改您创建的用户对象,以使它不会推送字符串,而将推送您在输入中键入的所有单词的数组,以便您可以键入多个角色,并且所有角色都将被应用

下面是执行此操作的代码:

roles.split(' ')

这是将您传递的字符串中的每个单词放入数组中的一个元素。

admin变为["admin"]

admin superuser变为["admin", "superuser"]

这是适合您的修改后的代码。

onSubmit(e) {
    e.preventDefault();

    const {
      phone,
      email,
      password,
      username,
      roles
    } = this.state;

    const user = [
      {
        email,
        password,
        username,
        profile: {
          name: { firstname, lastname },
          phone,
        },
        roles: roles.split(' '),
      }
    ];

    this.props.createUser("users.insert", user);
}