无法使用 @grpc/proto-loader 导入 google 的原型
Cannot import google's proto with @grpc/proto-loader
我有以下原型:
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());
当我 运行 客户端时,出现以下错误:TypeError: proto.Service 不是构造函数。我发现它与 status.proto 的导入有关。使用原型加载器导入 google 原型的正确方法是什么?服务器位于 Java.
这里的问题是 protoFiles('rpc')
returns 的路径不适用于 .proto
文件中的 import
行。该导入行意味着 @grpc/proto-loader
正在寻找包含 google/rpc/status.proto
的包含目录,但是 protoFiles('rpc')
returns 是直接包含 status.proto
的目录。因此,您必须更改其中一项或两项,以便相关目录正确匹配。
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());
希望对您有所帮助。 :)
我有以下原型:
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());
当我 运行 客户端时,出现以下错误:TypeError: proto.Service 不是构造函数。我发现它与 status.proto 的导入有关。使用原型加载器导入 google 原型的正确方法是什么?服务器位于 Java.
这里的问题是 protoFiles('rpc')
returns 的路径不适用于 .proto
文件中的 import
行。该导入行意味着 @grpc/proto-loader
正在寻找包含 google/rpc/status.proto
的包含目录,但是 protoFiles('rpc')
returns 是直接包含 status.proto
的目录。因此,您必须更改其中一项或两项,以便相关目录正确匹配。
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());
希望对您有所帮助。 :)