Protocol buffers Grpc节点:如何在Grpc服务器中编辑元数据并将编辑后的元数据发送回Grpc客户端?

Protocol buffers Grpc节点:如何在Grpc服务器中编辑元数据并将编辑后的元数据发送回Grpc客户端?,protocol-buffers,metadata,grpc,proto,grpc-node,Protocol Buffers,Metadata,Grpc,Proto,Grpc Node,Grpc节点:如何编辑元数据并将编辑后的元数据发送回客户端 下面是我目前拥有的,看起来元数据可以传递给grpc客户端RPC方法(“greetmath”),但我无法在服务器中编辑元数据并将其发送回客户端。它只能发回最初创建的元数据 我是否可以在grpc服务器中编辑元数据并将编辑后的元数据发送到grpc客户端 Greeter_server.js const path = require('path'); const PROTO_PATH = path.join(__dirname, '../prot

Grpc节点:如何编辑元数据并将编辑后的元数据发送回客户端

下面是我目前拥有的,看起来元数据可以传递给grpc客户端RPC方法(“greetmath”),但我无法在服务器中编辑元数据并将其发送回客户端。它只能发回最初创建的元数据

我是否可以在grpc服务器中编辑元数据并将编辑后的元数据发送到grpc客户端

Greeter_server.js

const path = require('path');
const PROTO_PATH = path.join(__dirname, '../proto/greet.proto');
// console.log("Proto path: ", PROTO_PATH);
const protoLoader = require('@grpc/proto-loader') //require('@grpc/proto-loader')
const grpc = require('grpc')


//grpc service definition for greet
const greetProtoDefinition = protoLoader.loadSync(PROTO_PATH, {
     keepCase: true,
      longs: String,
      enums: String,
      defaults: true,
      oneofs: true
});

const greetPackageDefinition = grpc.loadPackageDefinition(greetProtoDefinition).greet

function greetFunc(call, callback) {
    var firstName = call.request.greeting.first_name;
    var lastName = call.request.greeting.last_name;

    callback(null, {result: "Hello " + firstName + " " + lastName});
}


function greetMath(call, callback) {
    console.log("callback: ", call);
    console.log("Meta data: ", call.metadata._internal_repr.somekey);
    call.metadata._internal_repr.somekey.push('random');    

    var firstName = call.request.greeting.first_name;
    var lastName = call.request.greeting.last_name;
    let current = Number(process.hrtime.bigint());
    console.log("call obj: ", call);
    console.log("callback obj: ", callback);
    callback(null, {result: "Hello " + firstName + " " + lastName + " current: " + current});

}

function main() {
    const server = new grpc.Server()

    server.addService(greetPackageDefinition.GreetService.service, {
         greet: greetFunc,
         greetMath: greetMath
    });

    server.bind("127.0.0.1:4000", grpc.ServerCredentials.createInsecure());
    server.start();
    console.log("Server Running at http://127.0.0.1:50051")
}
main()
const path = require('path');
const PROTO_PATH = path.join(__dirname, '../proto/greet.proto');
const protoLoader = require('@grpc/proto-loader') //require('@grpc/proto-loader')
const grpc = require('grpc')


//grpc service definition for greet
const greetProtoDefinition = protoLoader.loadSync(PROTO_PATH, {
     keepCase: true,
      longs: String,
      enums: String,
      defaults: true,
      oneofs: true
});

const greetPackageDefinition = grpc.loadPackageDefinition(greetProtoDefinition).greet

const client = new greetPackageDefinition.GreetService("localhost:4000",
        grpc.credentials.createInsecure()
)


function callGreetings() {
    var request = {
         greeting: {
              first_name: "Jerry",
              last_name: "Tom"
         }
    }
     
    client.greet(request, (error, response) => {
        if(!error) {
            console.log("Greeting Response: ", response.result);
        } else {
            console.error(error)
        }
    })
}


function callGreetingsLogger() {
    var request = {
        greeting: {
             first_name: "Jerry",
             last_name: "Tom"
        }
   }
   let meta = new grpc.Metadata();
   meta.add('someKey', 'someVal'); 
   let end;
   let start = Number(process.hrtime.bigint());

   client.greetMath(request, meta, (error, response) => {
        if(!error) {
           console.log("res: ", response);
           console.log("metadata: ", meta);
           console.log("Greeting Response: ", response.result);
           end = Number(process.hrtime.bigint());
    

           console.log("start: ", start);
           console.log("end: ", end);
           console.log("end - start", (end - start)/ 1000000, "ms");
           
        function getDateTime() {
            var date = new Date();
            var hour = date.getHours();
            hour = (hour < 10 ? "0" : "") + hour;
            var min  = date.getMinutes();
            min = (min < 10 ? "0" : "") + min;
            var sec  = date.getSeconds(); sec = (sec < 10 ? "0" : "") + sec; 
            var year = date.getFullYear();
            var month = date.getMonth() + 1; month = (month < 10 ? "0" : "") + month;
            var day  = date.getDate(); day = (day < 10 ? "0" : "") + day;
            return month + "/" + day + "/" + year + "  |  Time: " + hour + ":" + min + ":" + sec;
        }

        let currentTime = getDateTime();
           console.log("Current time: ", currentTime);
       
       } else {
           console.error(error)
       }
   });

}

function main() {
    callGreetings();
    callGreetingsLogger();
}

main()

问候.proto

syntax = "proto3";

package greet;

service GreetService {
    //Unary API
    rpc Greet (GreetRequest) returns (GreetResponse) {};
    rpc GreetMath(GreetRequest) returns (GreetResponse) {};
}

message Greeting {
    string first_name = 1;
    string last_name = 2;
}

message GreetRequest {
     Greeting greeting = 1;
}

message GreetResponse {
     string result = 1;
}
greeter_client.js

const path = require('path');
const PROTO_PATH = path.join(__dirname, '../proto/greet.proto');
// console.log("Proto path: ", PROTO_PATH);
const protoLoader = require('@grpc/proto-loader') //require('@grpc/proto-loader')
const grpc = require('grpc')


//grpc service definition for greet
const greetProtoDefinition = protoLoader.loadSync(PROTO_PATH, {
     keepCase: true,
      longs: String,
      enums: String,
      defaults: true,
      oneofs: true
});

const greetPackageDefinition = grpc.loadPackageDefinition(greetProtoDefinition).greet

function greetFunc(call, callback) {
    var firstName = call.request.greeting.first_name;
    var lastName = call.request.greeting.last_name;

    callback(null, {result: "Hello " + firstName + " " + lastName});
}


function greetMath(call, callback) {
    console.log("callback: ", call);
    console.log("Meta data: ", call.metadata._internal_repr.somekey);
    call.metadata._internal_repr.somekey.push('random');    

    var firstName = call.request.greeting.first_name;
    var lastName = call.request.greeting.last_name;
    let current = Number(process.hrtime.bigint());
    console.log("call obj: ", call);
    console.log("callback obj: ", callback);
    callback(null, {result: "Hello " + firstName + " " + lastName + " current: " + current});

}

function main() {
    const server = new grpc.Server()

    server.addService(greetPackageDefinition.GreetService.service, {
         greet: greetFunc,
         greetMath: greetMath
    });

    server.bind("127.0.0.1:4000", grpc.ServerCredentials.createInsecure());
    server.start();
    console.log("Server Running at http://127.0.0.1:50051")
}
main()
const path = require('path');
const PROTO_PATH = path.join(__dirname, '../proto/greet.proto');
const protoLoader = require('@grpc/proto-loader') //require('@grpc/proto-loader')
const grpc = require('grpc')


//grpc service definition for greet
const greetProtoDefinition = protoLoader.loadSync(PROTO_PATH, {
     keepCase: true,
      longs: String,
      enums: String,
      defaults: true,
      oneofs: true
});

const greetPackageDefinition = grpc.loadPackageDefinition(greetProtoDefinition).greet

const client = new greetPackageDefinition.GreetService("localhost:4000",
        grpc.credentials.createInsecure()
)


function callGreetings() {
    var request = {
         greeting: {
              first_name: "Jerry",
              last_name: "Tom"
         }
    }
     
    client.greet(request, (error, response) => {
        if(!error) {
            console.log("Greeting Response: ", response.result);
        } else {
            console.error(error)
        }
    })
}


function callGreetingsLogger() {
    var request = {
        greeting: {
             first_name: "Jerry",
             last_name: "Tom"
        }
   }
   let meta = new grpc.Metadata();
   meta.add('someKey', 'someVal'); 
   let end;
   let start = Number(process.hrtime.bigint());

   client.greetMath(request, meta, (error, response) => {
        if(!error) {
           console.log("res: ", response);
           console.log("metadata: ", meta);
           console.log("Greeting Response: ", response.result);
           end = Number(process.hrtime.bigint());
    

           console.log("start: ", start);
           console.log("end: ", end);
           console.log("end - start", (end - start)/ 1000000, "ms");
           
        function getDateTime() {
            var date = new Date();
            var hour = date.getHours();
            hour = (hour < 10 ? "0" : "") + hour;
            var min  = date.getMinutes();
            min = (min < 10 ? "0" : "") + min;
            var sec  = date.getSeconds(); sec = (sec < 10 ? "0" : "") + sec; 
            var year = date.getFullYear();
            var month = date.getMonth() + 1; month = (month < 10 ? "0" : "") + month;
            var day  = date.getDate(); day = (day < 10 ? "0" : "") + day;
            return month + "/" + day + "/" + year + "  |  Time: " + hour + ":" + min + ":" + sec;
        }

        let currentTime = getDateTime();
           console.log("Current time: ", currentTime);
       
       } else {
           console.error(error)
       }
   });

}

function main() {
    callGreetings();
    callGreetingsLogger();
}

main()

const path=require('path');
const PROTO_PATH=PATH.join(_dirname,'../PROTO/greet.PROTO');
const protoLoader=require('@grpc/proto-loader')//require('@grpc/proto-loader'))
常量grpc=需要('grpc')
//grpc的服务定义
const greetProtoDefinition=protoLoader.loadSync(PROTO_路径{
基普卡斯:是的,
长:字符串,
枚举:字符串,
默认值:true,
真的吗
});
const greetPackageDefinition=grpc.loadPackageDefinition(greetProtoDefinition).greet
const client=new greetPackageDefinition.GreetService(“localhost:4000”,
grpc.credentials.createUnsecure()
)
函数callGreetings(){
var请求={
问候:{
名字:“杰瑞”,
姓:“汤姆”
}
}
client.greet(请求,(错误,响应)=>{
如果(!错误){
日志(“问候响应:”,响应.result);
}否则{
控制台错误(错误)
}
})
}
函数调用GreetingsLogger(){
var请求={
问候:{
名字:“杰瑞”,
姓:“汤姆”
}
}
设meta=new grpc.Metadata();
添加('someKey','someVal');
让我们结束;
let start=Number(process.hrtime.bigint());
client.greetMath(请求、元、(错误、响应)=>{
如果(!错误){
日志(“res:”,响应);
log(“元数据:”,meta);
日志(“问候响应:”,响应.result);
end=Number(process.hrtime.bigint());
日志(“开始:”,开始);
控制台日志(“结束:”,结束);
log(“结束-开始”,“结束-开始)/1000000,“毫秒”);
函数getDateTime(){
变量日期=新日期();
var hour=date.getHours();
小时=(小时<10?:“)+小时;
var min=date.getMinutes();
最小值=(最小值<10?:“)+min;
var sec=date.getSeconds();sec=(sec<10?:“)+sec;
var year=date.getFullYear();
var month=date.getMonth()+1;month=(月<10?:“)+month;
var day=date.getDate();day=(day<10?:“)+day;
返回月+“/”+日+“/”+年+”|时间:“+小时+”:“+分钟+”:“+秒;
}
让currentTime=getDateTime();
日志(“当前时间:”,当前时间);
}否则{
控制台错误(错误)
}
});
}
函数main(){
问候语();
callGreetingsLogger();
}
main()

我怀疑您试图更改gRPC的内部元数据(
call.metadata.\u internal\u repr
),这是不允许的

例如,在Go(lang)中,元数据的唯一公开方法是例如
GetMetadata()
,并且故意没有公共机制来更改此数据

您有一些选择:

  • 为元数据创建包含在消息中的消息类型
  • 如果您正试图扩展gRPC的功能,请考虑和
    • 问题是“我无法在服务器中编辑元数据并将其发送回客户端”。问题中的代码编辑元数据,因此我假设您正试图使用该代码来执行此操作,但这并不发送元数据,因为它从不调用调用调用的
      方法的
      sendMetadata
      。您需要调用该方法将元数据发送回客户端


      此外,您不应触摸
      元数据的
      \u internal\u repr
      。客户端代码通过调用
      meta.add()
      来正确处理此问题。服务器代码也应该这样做。因此,您应该编写
      call.metadata.get('somekey')
      ,而不是
      call.metadata.\u internal\u repr.somekey.push('random')
      您应该编写
      call.metadata.add('somekey','random')
      ,您可以在服务器上创建元数据并发送它,但您不能编辑在服务器上接收的元数据,然后将其发送回客户端。这将有助于了解您必须执行这些操作的代码,以了解这两种方法之间的区别。这不是问题所在。
      call.metadata
      对象是一个
      metadata
      实例,用户应该可以访问它。
      \u internal\u repr
      成员在逻辑上是内部的,但是可以访问,因为JavaScript原型是如何工作的。用户不应该触摸它,但这样做不应该导致问题中描述的问题。