首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用@grpc/ proto -加载程序导入google的proto

无法使用@grpc/ proto -加载程序导入google的proto
EN

Stack Overflow用户
提问于 2018-10-12 21:01:35
回答 2查看 5.7K关注 0票数 7

我有以下内容:

代码语言:javascript
复制
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);
}

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

代码语言:javascript
复制
    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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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“。

代码语言:javascript
复制
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());

希望能帮上忙。:)

票数 8
EN

Stack Overflow用户

发布于 2018-10-15 15:58:18

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52786951

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档