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

Posted

技术标签:

【中文标题】如何将元数据添加到nodejs grpc调用【英文标题】:How to add metadata to nodejs grpc call 【发布时间】:2016-09-28 07:23:21 【问题描述】:

我想知道如何将元数据添加到 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类型来实现我正在寻找的东西,并且文档有点稀疏关于如何实现这一目标。

【问题讨论】:

doc 指的是什么? 【参考方案1】:

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

【讨论】:

没必要。 CallCredentials.createFromPlugin 已经暴露为更惯用的 grpc.credentials.createFromMetadataGenerator。此外,您可以直接将元数据传递给调用,而无需使用凭据接口。【参考方案2】:

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

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

【讨论】:

【参考方案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]; 

【讨论】:

以上是关于如何将元数据添加到nodejs grpc调用的主要内容,如果未能解决你的问题,请参考以下文章

将元数据添加到 CSV 文件中以指示 Excel 应如何打开

如何将元数据谷歌语音传递给文本 api - swift ios

使用 Laravel 5.0 存储门面将元数据、标头(Expires、CacheControl)添加到上传到 Amazon S3 的文件中

Stripe:在创建时将元数据添加到订阅

matplotlib 可以将元数据添加到保存的图形中吗?

使用 @solana/web3.js 将元数据添加到 Solana 令牌