【问题标题】:How to load a proto file with imports如何使用导入加载 proto 文件
【发布时间】:2018-02-01 23:38:11
【问题描述】:

我正在使用dcodeIO/protobuf.js lib(版本 6.8.4)在浏览器中解析 protobuf 消息。 只要不导入另一个 proto 文件,我就可以使用简单的 proto 文件。

在主文件中导入其他 proto 文件会破坏一切。

这就是我所拥有的:

  • 文件结构

    - assets/
        |-api/
        |    |-v1/
        |    |    |-messageB.proto
        |    |-messageA.proto
    - foo.js
    
  • messageA.proto

    syntax = "proto3";
    package com.assets.api;
    import "api/v1/messageB.proto";
    
    message MessageA{
        MessageB foo = 0;
    }
    
  • messageB.proto

    syntax = "proto3";
    package com.assets.api.v1;
    
    message MessageB {
        string bar= 0;
    }
    
  • 使用 6.8.4:

    var MessageProto = null;
    protobuf.load({root:"assets", file:"api/messageA.proto"}, function (err, root) {
        if (root) { MessageAProto = root.lookupType("com.assets.api.MessageA");
    }});
    data = MessageProto .decode(rawData);
    

.

    Error: no such type

at Root.lookupType (http://localhost:63342/xx/build/app/vendor/protobuf/dist/protobuf.js:3463:15)
at http://localhost:63342/xx/build/app/src/app/asset/asset.module.js:320:53
at finish (http://localhost:63342/xx/build/app/vendor/protobuf/dist/protobuf.js:5212:9)
at Root.load (http://localhost:63342/xx/build/app/vendor/protobuf/dist/protobuf.js:5316:9)
at Object.load (http://localhost:63342/xx/build/app/vendor/protobuf/dist/protobuf.js:2547:17)
at new <anonymous> (http://localhost:63342/xx/build/app/src/app/asset/asset.module.js:316:22)
at Object.instantiate (http://localhost:63342/xx/build/app/vendor/angular/angular.js:4786:14)
at $controller (http://localhost:63342/xx/build/app/vendor/angular/angular.js:10607:28)
at Object.<anonymous> (http://localhost:63342/xx/build/app/vendor/angular-ui-router/release/angular-ui-router.js:4081:28)
at http://localhost:63342/xx/build/app/vendor/angular/angular.js:1259:18
  • 5.0:

    var MessageProto = null;
    dcodeIO.ProtoBuf.convertFieldsToCamelCase = true;
    dcodeIO.ProtoBuf.loadProtoFile({root: "assets", file: "api/messageA.proto"}, function (err, builder) {
        if (builder) { MessageProto = builder.build("com.assets.api.MessageA");
     }});
    data = MessageProto .decode(rawData);
    

    OK
    

【问题讨论】:

    标签: javascript protocol-buffers proto3 protobuf.js


    【解决方案1】:

    您需要首先检查 protobuf.load 是否已加载您的组件。如果没有加载,它将无法工作。

    您可以将负载更改为 loadSync

        var MessageProto = null;
        protobuf.loadSync({root:"assets", file:"api/messageA.proto"}, function(err, root) {
            if (root) { MessageAProto = root.lookupType("com.assets.api.MessageA");
        }});
    

    data = MessageProto .decode(rawData);

    您可以选择使用静态方法。

        import { AwesomeMessage } from "./bundle.js";
    
        // example code
        let message = AwesomeMessage.create({ awesomeField: "hello" });
        let buffer  = AwesomeMessage.encode(message).finish();
        let decoded = AwesomeMessage.decode(buffer);
    

    创建静态文件使用

    pbjs -t json-module -w commonjs -o bundle.js file1.proto file2.proto

    【讨论】:

      猜你喜欢
      • 2020-07-05
      • 1970-01-01
      • 2018-07-19
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 1970-01-01
      • 2021-01-02
      相关资源
      最近更新 更多