Обнаружено циклическое правило ACL, условие правила вызывает то же правило

Я получаю сообщение об ошибке при добавлении новых данных в гиперссылку.

Обновление работает нормально.

Вот мой код, в котором я столкнулся с проблемой

if (isExist) {
                const oldProOwnVal =  await PropertyOwnersRegistry.get(isExist.ownershipId);

                owners.ownership_start_date = oldProOwnVal.ownership_start_date;
                owners.created_at = oldProOwnVal.created_at;
                owners.updated_at = updatedProperty.timestamp;
                const mergeOwner = Object.assign(oldProOwnVal, owners);
                await PropertyOwnersRegistry.update(mergeOwner);
            } else {
                newKey =  'xxxx-xxxx-4xxx-yxxx-xxxx'.replace(/[xy]/g, function(c) {
                    var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
                    return v.toString(16);
                });
                const newOwnerRes = factory.newResource(NS, 'PropertyOwners', newKey);


                owners.ownership_start_date = updatedProperty.timestamp;
                owners.created_at = updatedProperty.timestamp;
                owners.updated_at = updatedProperty.timestamp;
                const newOwner = Object.assign(newOwnerRes, owners);
                await PropertyOwnersRegistry.add(newOwner);
            }

Проблема возникает только в очереди

await PropertyOwnersRegistry.add(newOwner);

Не знаю, что здесь происходит.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
294
2

Ответы 2

это может быть то, как вы настраиваете, до вызова API-интерфейсов Composer - например, getAssetRegistry (активы) или getParticipantRegistry (участники) - или иначе это выходит за рамки add в части 2. Я не видел вашу модель, или предыдущий код - дополняя соответствующим образом ниже:

это должно работать (не пробовали) - обратите внимание - у вас недетерминированный код, если вы тестируете с одобрением и т. д .:

const NS = 'org.acme.example';
var factory = getFactory();

const  propRegistry = await  getAssetRegistry(NS+ '.PropertyOwners'');

if (isExist) {
    const oldProOwnVal =  await propRegistry.get(isExist.ownershipId);

    owners.ownership_start_date = oldProOwnVal.ownership_start_date;
    owners.created_at = oldProOwnVal.created_at;
    const mergeOwner = Object.assign(oldProOwnVal, owners);
   //etc

    await propRegistry.update(mergeOwner);
 } else {           
     newKey =  'xxxx-xxxx-4xxx-yxxx-xxxx'.replace(/[xy]/g, function(c) {
                    var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);  // this code is non-deterministic
                    return v.toString(16);
                });
     const newOwnerRes = factory.newResource(NS, 'PropertyOwners', newKey);
     owners.ownership_start_date = updatedProperty.timestamp;
     owners.created_at = updatedProperty.timestamp;
     owners.updated_at = updatedProperty.timestamp;

     const newOwner = Object.assign(newOwnerRes, owners);

     await propRegistry.add(newOwner);
 }

Раньше я не добавлял полный код. На самом деле у меня уже есть propRegistry, определенное вверху. Когда я удаляю await propRegistry.add (newOwner); строка, ошибка исчезнет.

Tariq 26.10.2018 12:14

Могу ли я поделиться файлом BNA?

Tariq 26.10.2018 12:25

правильно, заголовок предполагает, что ваши списки контроля доступа, возможно, являются «проблемой». Вы проверили, работает ли код - без ограничения списков ACL? - это будет следующим логическим шагом (для устранения проблемы с кодом) - BNA через rocketchat (как .zip, а не .bna)

Paul O'Mahony 26.10.2018 12:42

хорошо, взглянул на ваш код. Проблема заключается в двух местах: 1) вы используете forEach с асинхронным циклом - см. stackoverflow.com/questions/45914162/… - в любом случае вы предоставляете список из своего объекта txn, поэтому используйте for (let owners of propertyOwnersList) вместо этого для обработки ресурсов PropertyOwners (они действительно должны быть участниками) и ожидание позаботится о добавлении и ...

Paul O'Mahony 26.10.2018 16:20

2) вы не предоставляете требуемые значения для нового экземпляра актива PropertyOwner (например, (например) newOwnerRes.is_owner = false; newOwnerRes.trustee_ownership_flag = "YES"; `Также вам необходимо создать новое отношение для поля property, например owners.property = factory.newRelationship(NS, 'Property', propertId); Достаточно скажем, это работает для меня - могу добавить Property и 2 x PropertyOwners из вашего образца JSON

Paul O'Mahony 26.10.2018 16:20

У меня была аналогичная проблема, но в моем случае я обновлял два актива назад и не ждал завершения другого. Это то, что я имею в виду

  const prodRegistry = await getAssetRegistry('org.trade.com.Product');
  const chequeReg = await getAssetRegistry('org.trade.com.Cheque');
  chequeRegistry.update(cheque);
  await prodRegistry.updateAll(products);

Исправление состоит в том, чтобы дождаться, пока первый реестр завершит обновление актива, прежде чем обновлять другой.

await chequeReg.update(cheque);
await prodRegistry.updateAll(products);

Другие вопросы по теме