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



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

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

我是否可以在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()

问候.原型

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

greetiner_client.js

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()

问题说"我无法在服务器中编辑元数据并将其发送回客户端;。问题中的代码编辑元数据,所以我假设这是您尝试使用的代码,但这不是发送元数据,因为它从不调用callsendMetadata方法。您需要调用该方法来将元数据发送回客户端。

此外,您不应触摸metadata_internal_repr。客户端代码通过调用meta.add()来正确处理此问题。服务器代码也应该这样做。因此,应该写call.metadata.get('somekey')而不是call.metadata._internal_repr.somekey,应该写call.metadata.add('somekey', 'random')而不是call.metadata._internal_repr.somekey.push('random')

我怀疑您试图更改gRPC的内部元数据(call.metadata._internal_repr(,但这是不允许的。

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

你有一些选择:

  • 创建一个消息类型,以便在消息中携带元数据
  • 如果您试图扩展gRPC的功能,请考虑自定义选项和扩展

最新更新