代码之家  ›  专栏  ›  技术社区  ›  Semper Virens

使用google的Proto文件。protobuf导入-导致NodeJS出现问题

  •  1
  • Semper Virens  · 技术社区  · 6 年前

    我有谷歌。profobuf。*导入到proto文件中(由go中编写的GRPC服务器使用)。当同一个proto文件用于在NodeJS中实现GRPC客户端时,我遇到了问题。

    详细信息:

    GRPC服务器使用的原型文件(用go编写):

    技术原型

    syntax = "proto3";
    
    package api;
    
    import "google/protobuf/duration.proto";
    import "google/protobuf/empty.proto";
    
    message Info {
        string desc = 1;
        google.protobuf.Duration ttl = 2;
    }
    
    service Tech {
        rpc BasicInfo(google.protobuf.Empty) returns (Info) {}
    }
    

    当NodeJs中写入的GRPC客户端使用此选项时:

    GetTech信息。js(前几行)

    'use strict';
    
    const PROTO_PATH = __dirname + '/../../api/tech.proto';
    const grpc = require('grpc');
    const apiProto = grpc.load(PROTO_PATH).api;
    

    我得到以下错误:

    /Users/././node_modules/protobufjs/dist/protobuf.js:4720
                                throw Error("failed to import '"+importFilename+"' in '"+filename+"': file not found");
                                ^
    
    Error: failed to import '/Users/././api/google/protobuf/duration.proto' in '/Users/././api/register.proto': file not found
        at Builder.ProtoBuf.Builder.BuilderPrototype.import (/Users/././node_modules/protobufjs/dist/protobuf.js:4720:35)
        at Object.ProtoBuf.loadJson (/Users/././node_modules/protobufjs/dist/protobuf.js:5225:26)
        at Object.ProtoBuf.loadProto (/Users/././node_modules/protobufjs/dist/protobuf.js:5128:25)
        at Object.ProtoBuf.loadProtoFile (/Users/././node_modules/protobufjs/dist/protobuf.js:5174:52)
        at Object.load (/Users/././node_modules/grpc/index.js:135:26)
        at Object.<anonymous> (/Users/././src/api/getTechInfo.js:5:23)
        at Module._compile (module.js:643:30)
        at Object.Module._extensions..js (module.js:654:10)
        at Module.load (module.js:556:32)
        at tryModuleLoad (module.js:499:12)
    

    问题在于proto文件中的导入:

    import "google/protobuf/duration.proto";
    import "google/protobuf/empty.proto";
    

    解决这些导入的建议方法是什么?提前谢谢。

    使用:

    Node v8.9.4
    "google-protobuf": "^3.5.0",
    "grpc": "^1.10.1",
    
    1 回复  |  直到 6 年前
        1
  •  3
  •   murgatroid99 dhg    5 年前

    这是gRPC库的已知问题,主要记录在 this issue 这个 grpc.load API不支持轻松加载 google/protobuf/*.proto 文件。

    最简单的解决方案是使用 @grpc/proto-loader 库,其中自动包括 google/protobuf/*。原型 加载proto文件时的文件。

    另一种解决方案是使用 grpc-tools 预生成可与一起使用的文件 google-protobuf 图书馆