我有以下内容:
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。
发布于 2018-10-16 18:24:39
奥尔加,如果使用的是PROTO_PATH,则不能使用includeDirs中的绝对路径。显然,您需要将这两个路径,即到myproto.proto的路径和到google文件的路径放到includeDirs中,并使用文件名作为PROTO_PATH,然后它就可以正常工作了。见这里:
https://github.com/grpc/grpc-node/issues/470
下面是可以工作的修改代码。请注意,我还必须将myproto.proto中的"Type“替换为”myproto.proto“。
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());希望能帮上忙。:)
发布于 2018-10-15 15:58:18
这里的问题是protoFiles('rpc')返回的路径不适用于.proto文件中的import行。导入行意味着@grpc/proto-loader正在寻找包含google/rpc/status.proto的包含目录,但是protoFiles('rpc')返回一个直接包含status.proto的目录。因此,您必须更改其中一个或两个,以使相关目录正确匹配。
https://stackoverflow.com/questions/52786951
复制相似问题