2016-05-30 70 views
7

Mi piacerebbe sapere come aggiungere metadati a una chiamata di funzione grpc nodojs. Posso utilizzare le credenziali del canale quando si effettua il cliente conCome aggiungere metadati a nodejs chiamata grpc

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

Quali sono inviare quando si utilizza client.Send(doc, callback), ma il server Go grpc guarda nei metadati richiesta di informazioni di identificazione che devo impostare. Ho provato a utilizzare grpc.credentials.combineChannelCredentials con la connessione non protetta e un'istanza grpc.Metadata ma non riesco a trovare il modo giusto per farlo.

L'errore che ho riscontrato è TypeError: compose's first argument must be a CallCredentials object. Ho provato a seguirlo ma va in codice c che mi perde, non riesco a vedere che tipo di javascript devo dare a comebineChannelCredentials per ottenere quello che sto cercando e i documenti sono un po 'scarni su come ottenere questo .

risposta

12

È possibile passare direttamente metadati come argomento facoltativo per una chiamata al metodo. Ad esempio, è possibile eseguire questa operazione:

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

Doveva essere qualcosa di facile come questo ... grazie! Speriamo che i documenti migliorino nel prossimo futuro. – PudgePacket

+0

Un po 'di conoscenza è una cosa pericolosa: P !! – PudgePacket

1

Alla fine l'ho elaborato attraverso l'introspezione del codice delle credenziali grpc e la modifica dell'implementazione per esporre una funzione interna. Nel modulo grpc nel node_modules, file di grpc/src/node/src/credentials.js aggiungere la riga

exports.CallCredentials = CallCredentials; 

dopo CallCredentials viene importato. Poi, nel codice, è possibile scrivere qualcosa di simile a

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

Quindi utilizzare extra_creds nel generatore di client

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

Ora è possibile rendere il vostro client

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

Non è necessario. 'CallCredentials.createFromPlugin' è già esposto come il più divertente' grpc.credentials.createFromMetadataGenerator'. Inoltre, è possibile passare i metadati direttamente alle chiamate, senza utilizzare l'interfaccia delle credenziali. – murgatroid99

3

Per motivi di completezza, ho intenzione di estendere la risposta @ murgatroid99.

Al fine di collegare i metadati a un messaggio sul client è possibile utilizzare:

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

Sul server lato int il metodo RPC di essere chiamati, quando si desidera catturare i dati è possibile utilizzare:

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]; 
}