обеспечение уникальности в свойствах модели loopback4

Я начал запускать простой проект hello world, используя lb4. Я создал базовый источник данных mongodb, а также репозиторий и простую модель (имя пользователя, пароль и идентификатор) для пользователей с помощью команды cli, предоставляемой loopback. Я также создал пользовательский контроллер со встроенным грубым выбором, обеспечиваемым loopback.
, как вы, возможно, знаете, это очень простая настройка, но если кому-то нужны подробности, я предоставлю, просто прокомментирую.
проблема в том, что когда я пытаюсь создать новых пользователей с помощью проводника, я сталкиваюсь с дубликатом того же модели имени пользователя. означает, что:

{
"_id" : ObjectId("5def4581f7f9d508b0da2d4c"),
"username" : "string",
"password" : "string"
}

а также:

{
"_id" : ObjectId("5def4584f7f9d508b0da2d4d"),
"username" : "string",
"password" : "string"
}

клиент должен ввести уникальное имя пользователя для регистрации. Это очевидно.
как я могу указать уникальность свойства модели в loopback 4 (не объявляя его как id)?


person Ali Bahrami    schedule 10.12.2019    source источник
comment
здесь есть связанный вопрос stackoverflow .com / questions / 25927961 /, но это для версии 3, а не 4.   -  person Ali Bahrami    schedule 10.12.2019
comment
да. Это соответствует вашим требованиям?   -  person Akif Hussain    schedule 10.12.2019
comment
поскольку lb3 находится на js, а lb4 - машинописный текст, я не знаю, как его реализовать.   -  person Ali Bahrami    schedule 10.12.2019


Ответы (2)


Из-за этой проблемы на github lb4 уже проверяет наличие дубликатов внутри своего контекста. с использованием индексов и кода ошибки 11000 mongoDB (я говорю о примере покупок, а не о простой lb4 app так что БУДЬТЕ ВНИМАТЕЛЬНЫ! Если хотите, можете реализовать уникальность, используя описание ниже). Я забыл сделать миграцию базы данных ????‍????.
вы можете выполнить миграцию базы данных с помощью этой команды:
npm run migrate
поэтому полный ответ должен быть таким:
1- внутри модели добавьте это: (измените uniqueEmail и адрес электронной почты на имя свойства, которое вы хотите быть уникальным)

@model({
    settings: {
        indexes: {
          uniqueEmail: {
            keys: {
              email: 1,
            },
            options: {
              unique: true,
            },
         },
    },
  },
})

2- проверьте внутри контроллера конечную точку, на которой вы хотите проверить уникальность, и добавьте попытку поймать ошибку уникальности, исходящую из вашего источника данных mongoDB:

try {
  // In my case create the new user, but can be anything you want
  const savedUser = await this.userRepository.create(
    _.omit(newUserRequest, 'password'),
  );

  // do stuff and return

} catch (error) {
  // MongoError 11000 duplicate key
  if (error.code === 11000 && error.errmsg.includes('index: uniqueEmail')) {
    throw new HttpErrors.Conflict('Email value is already taken');
  } else {
    throw error;
  }
}

3- запустить npm run migrate

Этот ответ теперь является общим ответом, который можно использовать для любого свойства любой модели. Надеюсь это поможет.

person Ali Bahrami    schedule 10.12.2019
comment
Ну, вы сказали, что определите уникальность в своем model. И вот вы сделали filtering и больше ничего! - person Akif Hussain; 10.12.2019
comment
Точно! я хотел объявить свойство уникальным, а не фильтровать результаты и не проверять их. Но я ничего не нашел. Если какой-либо ответ показывает решение внутри объявления моделей, принимаемое как правильный ответ, и я удалю свой. - person Ali Bahrami; 10.12.2019

Итак, в основном то, что я обнаружил, Loopback4 имеет свойство под названием name, которое является уникальным идентификатором для стратегии аутентификации (например, «базовый», «jwt» и т. Д.). Более подробную информацию можно получить здесь И здесь

Вы должны изменить username на name, чтобы выполнить ваше требование. Потому что так это работает в loopback4

person Akif Hussain    schedule 10.12.2019
comment
это решение будет работать с именами пользователей. а как насчет модели, которая не является частью аутентификации? как можно ограничить любое свойство модели, чтобы оно не повторялось? - person Ali Bahrami; 10.12.2019