Я получаю сообщение об ошибке при добавлении новых данных в гиперссылку.
Обновление работает нормально.
Вот мой код, в котором я столкнулся с проблемой
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);
Не знаю, что здесь происходит.
это может быть то, как вы настраиваете, до вызова 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);
}
Могу ли я поделиться файлом BNA?
правильно, заголовок предполагает, что ваши списки контроля доступа, возможно, являются «проблемой». Вы проверили, работает ли код - без ограничения списков ACL? - это будет следующим логическим шагом (для устранения проблемы с кодом) - BNA через rocketchat (как .zip, а не .bna)
хорошо, взглянул на ваш код. Проблема заключается в двух местах: 1) вы используете forEach с асинхронным циклом - см. stackoverflow.com/questions/45914162/… - в любом случае вы предоставляете список из своего объекта txn, поэтому используйте for (let owners of propertyOwnersList)
вместо этого для обработки ресурсов PropertyOwners
(они действительно должны быть участниками) и ожидание позаботится о добавлении и ...
2) вы не предоставляете требуемые значения для нового экземпляра актива PropertyOwner (например, (например) newOwnerRes.is_owner = false; newOwnerRes.trustee_ownership_flag = "YES"; `Также вам необходимо создать новое отношение для поля property
, например owners.property = factory.newRelationship(NS, 'Property', propertId);
Достаточно скажем, это работает для меня - могу добавить Property и 2 x PropertyOwners из вашего образца JSON
У меня была аналогичная проблема, но в моем случае я обновлял два актива назад и не ждал завершения другого. Это то, что я имею в виду
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);
Раньше я не добавлял полный код. На самом деле у меня уже есть propRegistry, определенное вверху. Когда я удаляю await propRegistry.add (newOwner); строка, ошибка исчезнет.