問題: composer-rest-serverによって生成されたRESTful API経由でトランザクションをPOSTできません。私はstatusCode 422を受け取っています。トランザクションインスタンスは無効です。ただし、同じ例がプレイグラウンドで機能します。RESTful APIによるトランザクションの送信(トランザクションIDとタイムスタンプの処理方法)
シナリオ:私は私の.ctoファイルにトランザクションと呼ばれるオファーを設定した オファーが家を購入する投稿は:
// Offer - Specifies an offer that a bidder places on a house listing with an associated price
transaction Offer {
o Double bidPrice
--> HouseListing listing
--> Person bidder
}
作曲静止サーバは、APIとを生成しました種類オファーの取引を投稿するには、次のJSON文字列:
{
"$class": "org.acme.purchasing.Offer",
"bidPrice": 0,
"listing": "string",
"bidder": "string",
"transactionId": "string",
"timestamp": "2017-07-21T13:37:09.460Z"
}
私はので、上記の例から派生し、次のJSONコード使用して、サンプルのトランザクションでこれを交換しました:を
{
"$class": "org.acme.purchasing.Offer",
"bidPrice": 1000,
"listing": "001",
"bidder": "RJOHNSON",
"transactionId": "1b9aa63c-dfad-4aad-a610-dfc80f2796b2",
"timestamp": "2017-07-21T13:37:09.460Z"
}
返される応答は、エラーコード422です:今、奇妙なことは、私はHyperledger作曲遊び場に同じBNAを展開し、正常型オファーの取引を実行することができる午前たことである
{
"error": {
"statusCode": 422,
"name": "ValidationError",
"message": "The `Offer` instance is not valid. Details: `transactionId` can't be set (value: \"1b9aa63c-dfad-4aad-a610-d...6b2\").",
"details": {
"context": "Offer",
"codes": {
"transactionId": [
"absence"
]
},
"messages": {
"transactionId": [
"can't be set"
]
}
},
"stack": "ValidationError: The `Offer` instance is not valid. Details: `transactionId` can't be set (value: \"1b9aa63c-dfad-4aad-a610-d...6b2\").\n at /usr/lib/node_modules/composer-rest-server/node_modules/loopback-datasource-juggler/lib/dao.js:355:12\n at ModelConstructor.<anonymous> (/usr/lib/node_modules/composer-rest-server/node_modules/loopback-datasource-juggler/lib/validations.js:566:11)\n at ModelConstructor.next (/usr/lib/node_modules/composer-rest-server/node_modules/loopback-datasource-juggler/lib/hooks.js:93:12)\n at ModelConstructor.<anonymous> (/usr/lib/node_modules/composer-rest-server/node_modules/loopback-datasource-juggler/lib/validations.js:563:23)\n at ModelConstructor.trigger (/usr/lib/node_modules/composer-rest-server/node_modules/loopback-datasource-juggler/lib/hooks.js:83:12)\n at ModelConstructor.Validatable.isValid (/usr/lib/node_modules/composer-rest-server/node_modules/loopback-datasource-juggler/lib/validations.js:529:8)\n at /usr/lib/node_modules/composer-rest-server/node_modules/loopback-datasource-juggler/lib/dao.js:351:9\n at doNotify (/usr/lib/node_modules/composer-rest-server/node_modules/loopback-datasource-juggler/lib/observer.js:155:49)\n at doNotify (/usr/lib/node_modules/composer-rest-server/node_modules/loopback-datasource-juggler/lib/observer.js:155:49)\n at doNotify (/usr/lib/node_modules/composer-rest-server/node_modules/loopback-datasource-juggler/lib/observer.js:155:49)\n at doNotify (/usr/lib/node_modules/composer-rest-server/node_modules/loopback-datasource-juggler/lib/observer.js:155:49)\n at Function.ObserverMixin._notifyBaseObservers (/usr/lib/node_modules/composer-rest-server/node_modules/loopback-datasource-juggler/lib/observer.js:178:5)\n at Function.ObserverMixin.notifyObserversOf (/usr/lib/node_modules/composer-rest-server/node_modules/loopback-datasource-juggler/lib/observer.js:153:8)\n at Function.ObserverMixin._notifyBaseObservers (/usr/lib/node_modules/composer-rest-server/node_modules/loopback-datasource-juggler/lib/observer.js:176:15)\n at Function.ObserverMixin.notifyObserversOf (/usr/lib/node_modules/composer-rest-server/node_modules/loopback-datasource-juggler/lib/observer.js:153:8)\n at Function.ObserverMixin._notifyBaseObservers (/usr/lib/node_modules/composer-rest-server/node_modules/loopback-datasource-juggler/lib/observer.js:176:15)"
}
}
。
プレイグランドでは、「トランザクションID」と「タイムスタンプ」は指定されていないことに注意してください。プレイグラウンドはこれらの値を処理するように見えます。たとえば、これは遊び場が最初に私に提案しているものです:オファーインスタンスが有効でないと言っている理由
{
"$class": "org.acme.purchasing.Offer",
"bidPrice": 0,
"listing": "resource:org.acme.purchasing.HouseListing#id:7965",
"bidder": "resource:org.acme.purchasing.Person#id:4441"
}
は誰でも助言することはできますか?私が最初に考えたのは、 "transactionId"に配置している文字列が好きではないということでしたが、もう1つのスタックオーバーフローポストはtransactionIdが私が既に生成した任意のUUIDv4文字列であることを指摘しています。
更新#1:でも、デフォルトのデモ
BNAによって確実にするために失敗すると、エラーがない、私は私の地元のHyperledgerファブリック上に(厳密に私の例に似ている)、デフォルトのcarauction-デモを展開してきましたComposer-rest-serverをデプロイします。私はまた、同じBNAをプレイグラウンドに展開しました。すべてのアセットと参加者は、エクスプローラ(ローカルインスタンス)とプレイグラウンドの両方で同一に作成されました。オファー取引を提出する時間が来たとき:
{
"$class": "org.acme.vehicle.auction.Offer",
"bidPrice": 800,
"listing": "resource:org.acme.vehicle.auction.VehicleListing#L001",
"member": "resource:org.acme.vehicle.auction.Member#[email protected]"
}
このJSONはプレイグラウンドによって生成され、そこで成功しました。エクスプローラにコピー/ペースト/実行するとステータス500のエラーが発生します。
{
"error": {
"statusCode": 500,
"name": "Error",
"message": "error trying invoke chaincode. Error: chaincode error (status: 500, message: Error: Object with ID 'string' in collection with ID 'Asset:org.acme.vehicle.auction.VehicleListing' does not exist)",
"stack": "Error: error trying invoke chaincode. Error: chaincode error (status: 500, message: Error: Object with ID 'string' in collection with ID 'Asset:org.acme.vehicle.auction.VehicleListing' does not exist)\n at _initializeChannel.then.then.then.then.catch (/usr/lib/node_modules/composer-rest-server/node_modules/composer-connector-hlfv1/lib/hlfconnection.js:806:34)"
}
}
ここでは何が間違っているのかはまだ分かりません。
感謝を作成し、支援を感謝しています。トランザクションID文字列を削除すると、ステータスコード500のエラーが表示されます。エラー:チェーンコードエラーが発生しました。エラー:チェーンコードエラー(ステータス:500、メッセージ:エラー:ID ' acme.purchasing.HouseListing 'は存在しません) "。まだ文字列オブジェクトを期待しているようです。 – JesterMania
完全に修飾されていないか、存在しないIDなど、正しく指定されていないアセットを更新しようとしているようですか?私は、(取引の)リスティングがAsset HouseListingとの関係を持っていることを知っています(ここには掲載されていません)。あなたはまだインスタンスを持っています。 –
はい、そのアセットのインスタンスは現在のところまだ存在しています。テストとして、私は、デフォルトのcarauction-network BNAを自分のhyperledgerインスタンスに配備し、composer-rest-serverを実行しました。 このBNAをPlaygroundに展開すると、資産、参加者を作成してOfferトランザクションを実行することができました。 RESTful APIエクスプローラで同じ操作を実行しようとすると、アセットと参加者を作成できますが、Offerトランザクション(エラーステータス500)を実行しようとすると失敗します。 誰かがExplorer経由でcarauction-network上でOfferトランザクションを実行したことがありますか、それともバグですか? – JesterMania