Как загрузить файл прото с импортом
Я использую библиотеку dcodeIO / protobuf.js (версия 6.8.4) для разбора сообщений protobuf в браузере. Я могу заставить его работать с простыми прото-файлами, если другой прото-файл не импортирован.
Импорт других прототипов в основной нарушает все.
Вот что у меня есть:
Файловая структура
- 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
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-модуль -w commonjs -o bundle.js file1.proto file2.proto