2016-05-30 9 views
7

nodejs grpc関数呼び出しにメタデータを追加する方法を知りたいと思います。 client.Send(doc, callback)を使用するときに送信されnodejs grpc callにメタデータを追加する方法

var client = new proto.Document('some.address:8000', 
    grpc.credentials.createInsecure() 
) 

とクライアントを作るとき、私は、チャネルの資格情報を使用することができますが、外出先grpcサーバは、私が設定する必要があり、識別情報の呼び出しのメタデータを検索します。私はgrpc.credentials.combineChannelCredentialsを安全でない接続とgrpc.Metadataインスタンスで使用しようとしましたが、正しい方法を見つけることができません。

エラーはTypeError: compose's first argument must be a CallCredentials objectです。私はそれをフォローしようとしましたが、それは私を失うCコードに入ります、私はcomebineChannelCredentialsに私が探しているものを達成するために何を与えなければならないjavascriptのタイプを見ることができないし、ドキュメントはこれを達成する方法について少し疎です。

答えて

12

作ることができ、クライアントビルダー

var creds = grpc.credentials.combineChannelCredentials(
    grpc.credentials.createSsl(), 
    extra_creds, 
) 

extra_credsを使用

var meta = grpc.Metadata(); 
meta.add('key', 'value'); 
var extra_creds = grpc.credentials.CallCredentials.createFromPlugin(
    function (url, callback) { 
    callback(null, meta); 
    } 
) 

ような何かを書くことができますメソッド呼び出しのオプションの引数として使用します。たとえば、これを行うことができます:

var meta = new grpc.Metadata(); 
meta.add('key', 'value'); 
client.send(doc, meta, callback); 
+1

これのような簡単なものだったら...ありがとう!近い将来に文書が改善されることを願っています。 – PudgePacket

+0

知識の少しは危険なものです:P !! – PudgePacket

1

私は最終的にgrpcの資格情報コードを調べ、インプリメンテーションを変更して内部機能を公開するようにしました。 node_modulesgrpcモジュールでは、ファイルはCallCredentialsがインポートされ

exports.CallCredentials = CallCredentials; 

後の行を追加しますgrpc/src/node/src/credentials.js。次に、あなたのコードでは、あなたはその後、今、あなたはあなたが直接メタデータを渡すことができ、あなたのクライアント

var client = new proto.Document(
    'some.address:8000', 
    creds, 
) 
+1

これは必須ではありません。 'CallCredentials.createFromPlugin'は、より慣習的な' grpc.credentials.createFromMetadataGenerator'として既に公開されています。さらに、資格情報インターフェイスをまったく使用せずに、メタデータをコールに直接渡すこともできます。 – murgatroid99

3

私は@ murgatroid99答えに拡張するつもりです。オーダークライアントにメッセージにメタデータを添付し、使用することができて

:サーバー側で

var meta = new grpc.Metadata(); 
meta.add('key', 'value'); 
client.send(doc, meta, callback); 

あなたのRPCメソッドが呼び出されているint型、あなたがあなたのデータを取得したいときにすることができ使用:

function(call, callback){ 
    var myVals = call.metadata.get("key"); 
    //My vals will be an array, so if you want to grab a single value: 
    var myVal = myVals[0]; 
} 
関連する問題