我正在尝试编写一个简单的应用程序,利用 GTFS(通用/Goodle Transit Feed 规范)来检索有关道路状况的警报。我已经设法获得了我正在使用的代码片段,以便与 vanilla js 和 typescript 一起使用,但到目前为止,我还没有设法让它与 React Native 一起使用,这正是我需要它使用的。下面是我目前使用的代码片段(适用于 ts 和 js)
const url = CONSTANTS.API_URL;
protobuf.load('protocol.proto', (err, root) => {
if (err) {
throw err;
}
const TransitRealtime = root.lookupType('transit_realtime.FeedMessage');
fetch(url)
.then(response => response.arrayBuffer())
.then(buffer => {
const message = TransitRealtime.decode(new Uint8Array(buffer));
const object = TransitRealtime.toObject(message, {
longs: String,
enums: String,
bytes: String,
});
console.log(object.entity[1].alert.headerText);
console.log(object.entity[1].alert.descriptionText);
})
.catch(error => {
console.error('There was a problem with the fetch operation:', error);
});
});
我的react-native项目使用.js作为文件格式。
我目前有位于 android/app/src/main/assets 中的默认 GTFS 协议 .proto 文件,代码应该能够访问它(我尝试使用 RNFS 读取并在控制台中显示内容,效果很好).
令我困惑的是,“预期”这个词在我的整个工作空间中都不存在。这也是我第一次使用protocol buffer。我使用 protobufjs 来处理它们。
好吧,我设法弄清楚了,所以我将在这里发布代码片段,以防有人需要在 15 年内找到这个利基问题的答案
const protoFilePath =
${RNFS.DocumentDirectoryPath}/protocol.proto
;
const protoContent = await RNFS.readFile(protoFilePath, 'utf8');
const root = protobuf.parse(protoContent).root;
const TransitRealtime = root.lookupType('transit_realtime.FeedMessage');
const response = await fetch(url);
const buffer = await response.arrayBuffer();
const message = TransitRealtime.decode(new Uint8Array(buffer));
const object = TransitRealtime.toObject(message, {
longs: String,
enums: String,
bytes: String,
});
const data = object.entity;