В настоящее время я разрабатываю транзакцию в Hyperledger Composer.Эта транзакция создаст 2 разных Актива: Актив A и Актив B. В Активе A есть поле с типом Актив B. Поэтому мне сначала нужно создать Актив B, а затем создать Актив A со ссылкой на Актив B. Мне удалосьреализовать логику, после нескольких усилий.Теперь узел возвращает следующую ошибку:
2018-10-10T14: 06: 14.022Z [5ad2a944] ОТЛАДКА: NodeDataCollection: add ()> assetAIdValue, {"$ class": "mynamespace.assetA"," assetAId ":" assetAIdValue "," assetAFieldX ":" assetAFieldXValue "," assetB ": [" resource: mynamespace.assetB # assetBIdValue1 "," resource: mynamespace.assetB # assetBIdValue2 "]}," $ registryType "«Актив», «$ registryId»: «mynamespace.assetA»}, false
(узел: 17) UnhandledPromiseRejectionWarning: необработанное отклонение обещания (идентификатор отклонения: 2): Ошибка: ошибка при создании AssetA с идентификатором assetAIdValue
Ошибка: [5ad2a944] Нет контекста главной книги для GetState.Отправка ОШИБКИ
Вот моя модель
namespace mynamespace
/**
* Definition of createAssetA transaction
*/
transaction createAssetA{
o String assetAId
o String assetAFieldX
o AssetB[] assetB
}
/**
* Definition of AssetA asset
*/
asset AssetA identified by assetAId{
o String assetAId
o String assetAFieldX
--> AssetB[] assetB
}
/**
* Definition of assetB asset
*/
asset AssetB identified by AssetBId{
o String assetBId
o String assetBFieldX
o String assetBFieldY
}
Вот моя логика.js
/**
* Creates the assets assetB and assetA
* @param {mynamespace.createAssetA} createAssetA - the AssetA to create
* @transaction
*/
function createAssetA(createAssetA) {
return getAssetRegistry('mynamespace.AssetB')
.then(function (assetBRegistry) {
// Add all the AssetBs to the AssetB registry
assetBRegistry.addAll(createAssetA.assetB)
.then(function(){
addAssetA(createAssetA);
}, function(error) {
throw new Error ('Error while creating AssetBs' + '\n' + error);
} );
});
}
/**
* Function to add assetA asset to registry
* @param {*} createAssetA - The createAssetA Transaction containing the assetA info
*/
function addAssetA(createAssetA){
return getAssetRegistry('mynamespace.AssetA')
.then(function (assetARegistry) {
var newAssetA = castcreateAssetATxToAsset(createAssetA);
return assetARegistry.add(newAssetA).catch(function (error) {
throw new Error ('Error when creating AssetA with id ' + createAssetA.id + '\n' + error);
});
});
}
/**
* Casts the createAssetA transaction as a AssetA Asset
* @param {*} createAssetA - The transaction createAssetA to cast
* @returns {mynamespace.AssetA} the AssetA Asset with the info from the createAssetA param
*/
function castcreateAssetATxToAsset(createAssetA){
var factory = getFactory();
// Create a new instance of AssetA class from the mynamespace namespace with the id createAssetA.id
var newAssetA = factory.newResource('mynamespace', 'AssetA', createAssetA.id);
newAssetA.assetAFieldX = createAssetA.assetAFieldX;
newAssetA.assetB = [];
for (var i = 0; i < createAssetA.assetB.length; i++) {
var assetB = factory.newRelationship('mynamespace', 'assetB', createAssetA.assetB[i].id);
newAssetA.assetB[i] = assetB;
}
return newAssetA;
}
А вот и содержание моего запроса
{
"$class": "mynamespace.createAssetA",
"assetAId": "assetAIdValue",
"assetAFieldX": "assetAFieldXValue",
"assetB": [
{
"$class": "mynamespace.assetB",
"assetBId": "assetBIdValue1",
"assetBFieldX": "assetBFieldXValue",
"assetBFieldY": "assetBFieldYValue"
},
{
"$class": "mynamespace.assetB",
"assetBId": "assetBIdValue2",
"assetBFieldX": "assetBFieldXValue",
"assetBFieldY": "assetBFieldYValue"
}
]
}
Если кто-то обнаружит причину такой ошибки, он спасет мой день!
Другой вопрос : Эта ошибка видна только когда я смотрю на контейнеры с цепочками кодов.Кто-нибудь знает, как я могу сделать их видимыми с сервера Composer REST?