Исключение при вызове метода «users.insert» Ошибка: Матч ошибка: ожидается массив, получил «админа» в поле [0] .roles Чтение метаданных проекта

голоса
1

Я пытаюсь вставить коллекцию пользователя , но получить вышеуказанную ошибку. Есть ли способ , чтобы сделать запись поля в массив. Он ожидает массив , но я вхожу 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>
Задан 07/11/2018 в 20:08
источник пользователем
На других языках...                            


1 ответов

голоса
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);
}
Ответил 07/11/2018 в 21:27
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more