Исключительная ситуация при вызове метода 'users.insert'. Ошибка: ошибка сопоставления: ожидаемый массив получил значение «admin» в поле [0] .roles Чтение метаданных проекта - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь вставить коллекцию пользователей, но получаю вышеуказанную ошибку. Есть ли способ сделать запись поля в массиве. Он ожидает массив, но я ввожу admin в поле моей роли. Как я могу вставить роли в виде массива из пользовательского интерфейса?

Это 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 голосов
/ 08 ноября 2018

Хотя вы инициализируете роли в виде массива в своем состоянии, вы переопределяете это, когда вводите ввод и превращаете его в строку.

Для начала 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);
}
...