2016-05-30 3 views
7

Я хотел бы знать, как добавить метаданные в вызов функции nodejs grpc. Я могу использовать учетные данные канала при создании клиента сКак добавить метаданные в nodejs grpc call

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

Какие посылают при использовании client.Send(doc, callback), но сервер идет КПГРЫ выглядит в метаданных вызова для идентификации информации, которую я должен установить. Я попытался использовать grpc.credentials.combineChannelCredentials с небезопасным соединением и экземпляр grpc.Metadata, но я не могу найти правильный способ сделать это.

Ошибка, с которой я столкнулся, - TypeError: compose's first argument must be a CallCredentials object. Я попытался следовать за ним, но он переходит в код c, который меня теряет, я не вижу, какой тип javascript я должен дать comebineChannelCredentials, чтобы достичь того, что я ищу, и документы немного редки, как достичь этого ,

ответ

12

Вы можете передавать метаданные непосредственно как необязательный аргумент вызова метода. Так, например, вы можете сделать это:

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

Должно быть, что-то вроде этого ... спасибо! Надеемся, что документы улучшатся в ближайшем будущем. – PudgePacket

+0

Немного знаний - опасная вещь: P !! – PudgePacket

1

В конечном итоге я разработал его с помощью интроспекции кода учетных данных grpc и изменения реализации, чтобы выставить внутреннюю функцию. В grpc модуля в node_modules, файл grpc/src/node/src/credentials.js добавьте строку

exports.CallCredentials = CallCredentials; 

после CallCredentials импортируется. Затем, в вашем коде, вы можете написать что-то вроде

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

Затем используйте extra_creds в клиентском строитель

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

Теперь вы можете сделать ваш клиент

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 вызывается, когда вы хотите, чтобы захватить ваши данные, которые вы можете использование:

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]; 
} 
Смежные вопросы