无法使用@grpc/原型加载器导入谷歌的原型



我有以下原型:

syntax = "proto3";
import "google/rpc/status.proto";
message Response {   
google.rpc.Status status = 1;
}
message Request {   
Type name = 1;
}
service Service {
rpc SomeMethod (Request) returns (Response);
}

我正在节点中编写一个客户端:

const path = require('path');
const grpc = require('grpc');
const protoLoader = require('@grpc/proto-loader');
const protoFiles = require('google-proto-files');
const PROTO_PATH = path.join(__dirname, '/proto/myproto.proto');
const packageDefinition = protoLoader.loadSync(
PROTO_PATH,
{
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true,
includeDirs: [protoFiles('rpc')],
},
);
const proto = grpc.loadPackageDefinition(packageDefinition);
const client = new proto.Service('localhost:1111', grpc.credentials.createInsecure());

当我运行客户端时,我收到以下错误:类型错误:原型。服务不是构造函数。我发现它与status.proto的导入有关。使用原型加载器导入谷歌原型的正确方法是什么?服务器是Java。

Olga,如果您使用的是includeDirs,则不能在PROTO_PATH中使用绝对路径。显然,您需要将两个路径(即指向myproto.proto的路径(和指向google-proto-files的路径放入includeDirs中,并仅使用文件名作为PROTO_PATH然后它就可以正常工作。看这里:

https://github.com/grpc/grpc-node/issues/470

这是修改后有效的代码。请注意,我还必须在myproto.proto中将"Type"替换为"int32"。

const path = require('path');
const grpc = require('grpc');
const protoLoader = require('@grpc/proto-loader');
const protoFiles = require('google-proto-files');
const PROTO_PATH = 'myproto.proto';
const packageDefinition = protoLoader.loadSync(
PROTO_PATH,
{
keepCase: true,
longs: String,
enums: String,
defaults: true,
oneofs: true,
includeDirs: ['node_modules/google-proto-files', 'proto']
},
);
const protoDescriptor = grpc.loadPackageDefinition(packageDefinition);
const client = new protoDescriptor.Service('localhost:1111',  grpc.credentials.createInsecure());

希望对您有所帮助。 :)

这里的问题是protoFiles('rpc')返回的路径不适用于.proto文件中的import行。该导入行意味着@grpc/proto-loader正在寻找包含google/rpc/status.proto的包含目录,但protoFiles('rpc')返回直接包含status.proto的目录。因此,您必须更改其中一项或两项,以便相对目录正确匹配。

最新更新