Как добавить метаданные в вызов 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);

на сервере side int вызывается ваш метод 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,
)