2017-07-21 4 views
0

問題: 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)" 
    } 
} 

ここでは何が間違っているのかはまだ分かりません。

答えて

0

ComposerはtransactionId自体を生成されたものとして更新しますが、JSONではこれを行うことができないため、エラーが発生するのはなぜですか。これは/ POST REST操作では表示されないループバック - >スウガガー変換の問題です - ここに取り込まれましたhttps://github.com/hyperledger/composer/issues/663

+0

感謝を作成し、支援を感謝しています。トランザクションID文字列を削除すると、ステータスコード500のエラーが表示されます。エラー:チェーンコードエラーが発生しました。エラー:チェーンコードエラー(ステータス:500、メッセージ:エラー:ID ' acme.purchasing.HouseListing 'は存在しません) "。まだ文字列オブジェクトを期待しているようです。 – JesterMania

+0

完全に修飾されていないか、存在しないIDなど、正しく指定されていないアセットを更新しようとしているようですか?私は、(取引の)リスティングがAsset HouseListingとの関係を持っていることを知っています(ここには掲載されていません)。あなたはまだインスタンスを持っています。 –

+0

はい、そのアセットのインスタンスは現在のところまだ存在しています。テストとして、私は、デフォルトのcarauction-network BNAを自分のhyperledgerインスタンスに配備し、composer-rest-serverを実行しました。 このBNAをPlaygroundに展開すると、資産、参加者を作成してOfferトランザクションを実行することができました。 RESTful APIエクスプローラで同じ操作を実行しようとすると、アセットと参加者を作成できますが、Offerトランザクション(エラーステータス500)を実行しようとすると失敗します。 誰かがExplorer経由でcarauction-network上でOfferトランザクションを実行したことがありますか、それともバグですか? – JesterMania

1

多くの実験と検索の結果、NPMがsudoを使用してインストールされているという結論でしたルートとして)。私はroot以外の人物としてインストールを再開し、問題は解決されました。すべてが期待どおりに動作しています。

0

私は正常に取引(/ POST)を実行しました。私は、 '500'エラーは、RESTを介してOfferトランザクションに欠落しているフィールド( 'string'タイプ)または関係があるためだと思います。

{ 
    "$class": "org.acme.vehicle.auction.Offer", 
    "bidPrice": 20, 
    "listing": "org.acme.vehicle.auction.VehicleListing#100", 
    "member": "org.acme.vehicle.auction.Member#[email protected]" 
} 

OR

{ 
    "$class": "org.acme.vehicle.auction.Offer", 
    "bidPrice": 20, 
    "listing": "org.acme.vehicle.auction.VehicleListing#100", 
    "member": "org.acme.vehicle.auction.Member#[email protected]", 
    "timestamp": "2017-07-28T14:07:02.558Z" 
} 

は、(200で応答:/ POSTを使用して、これらのオファー取引のどちらかがエクスプローラに成功した車のオークションネットワークhttps://github.com/hyperledger/composer-sample-networks/blob/master/packages/carauction-network/models/auction.cto

の例を使用して

SUCCESS)とエクスプローラのtransactionId:

{ 
    "$class": "org.acme.vehicle.auction.Offer", 
    "bidPrice": 20, 
    "listing": "org.acme.vehicle.auction.VehicleListing#100", 
    "member": "org.acme.vehicle.auction.Member#[email protected]", 
    "transactionId": "e75b9934-1f08-4daf-90db-702bbe4b8fa1" 
} 

これは

{ 
    "$class": "org.acme.vehicle.auction.VehicleListing", 
    "listingId": "100", 
    "reservePrice": 50, 
    "description": "string", 
    "state": "FOR_SALE", 
    "offers": [ 
    { 
     "$class": "org.acme.vehicle.auction.Offer", 
     "bidPrice": 50, 
     "listing": "100", 
     "member": "resource:org.acme.vehicle.auction.Member#[email protected]", 
     "transactionId": "string123", 
     "timestamp": "2017-07-28T14:07:02.825Z" 
    } 
    ], 
    "vehicle": "resource:org.acme.vehicle.auction.Vehicle#123" 
} 

上記#100のための私のVehicleListing資産JSONであると、私は車の123の資産だけでなく、メンバー[email protected]

+0

もう一度お手伝いしてくださってありがとうございました。今度はトランザクションを正常に実行することができました。 npmがrootでインストールされていることが判明しました。一度自分のユーザ名の下にnpmをインストールすると、すべてが大丈夫でした。アクセスの問題があったはずですが、私の問題は解決しました。 – JesterMania

関連する問題