如何将元数据添加到nodejs grpc调用

How to add metadata to nodejs grpc call

我想知道如何将元数据添加到 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 代码,这让我迷路了,我看不到我必须给 comebineChannelCredentials 什么 javascript 类型来实现我正在寻找的东西,文档是关于如何实现这一目标的内容很少。

我最终通过反省 grpc 凭据代码并修改实现以公开内部函数来解决这个问题。在 node_modulesgrpc 模块中,文件 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,
)

您可以将元数据作为可选参数直接传递给方法调用。因此,例如,您可以这样做:

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