Как добавить метаданные к вызову nodejs grpc

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

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

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

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

3 ответа

Решение

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

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

Для полноты картины я собираюсь продолжить ответ @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]; 
}

В конце концов я решил это путем анализа кода учетных данных 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,
)
Другие вопросы по тегам