Exception while invoking method 'users.insert' Error: Match error: Expected array, got "admin" in field [0].roles Reading project metadata

Exception while invoking method 'users.insert' Error: Match error: Expected array, got "admin" in field [0].roles Reading project metadata

我正在尝试插入用户集合但出现上述错误。有没有办法将字段输入数组。它需要一个数组,但我在我的角色字段中输入 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>

尽管您将角色初始化为状态中的数组,但是当您输入输入并将其转换为字符串时,您将覆盖它。

开始于 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);
}