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