无法读取未定义的 属性 'decode'

Cannot read property 'decode' of undefined

我一直在研究通用交通信息流规范 - 实时,并且我完全遵循 google 文档中给出的示例:

https://developers.google.com/transit/gtfs-realtime/examples/nodejs-sample

对于 JavaScript,使用我所在城市的本地交通提要,但是我一直遇到以下错误:

var feed = GtfsRealtimeBindings.FeedMessage.decode(body);
                                            ^
TypeError: Cannot read property 'decode' of undefined

我在 python 中有一个有效的实现,它遵循他们的示例,所以我可以确定地验证提要是正确的格式。

我是运行使用指令的代码:

node index.js

我的 package.json 包括所有相关的依赖项,我已经使用 npm 安装了所需的包。 我已经广泛搜索了这个错误的解决方案,但没有运气。有什么建议吗?

查看 GitHub 上的当前示例代码 (https://github.com/MobilityData/gtfs-realtime-bindings/tree/master/nodejs#example-code) 看来你在中间缺少 transit_realtime:

GtfsRealtimeBindings.transit_realtime.FeedMessage.decode(body);

示例中有一个 link 到 Javascript 语言绑定的 github。 github 示例与文档示例不同。我认为文档已经过时了。

google 文档示例中的行

var feed = GtfsRealtimeBindings.FeedMessage.decode(body);

应该是var feed = GtfsRealtimeBindings.transit_realtime.FeedMessage.decode(body);注意包含.transit_realtime.

或者,这可以在以下行中表示:

var GtfsRealtimeBindings = require('gtfs-realtime-bindings');

作为var GtfsRealtimeBindings = require('gtfs-realtime-bindings').transit_realtime;

并且该行之外的 google 文档示例代码将保持原样。

您需要通过引用 transit_realtime 属性 来导入 gtfs-realtime-bindings。这是对旧 protobuf.js 绑定生成器的更改,但这样做是为了分隔命名空间。

不行

cont GtfsRealtimeBindings = require('gtfs-realtime-bindings');

它将:

const GtfsRealtimeBindings = require('gtfs-realtime-bindings').transit_realtime;

现在您可以获取 feedMessage 并对其进行解码。

const { FeedMessage, FeedHeader, FeedEntity, VehiclePosition } = GtfsRealtimeBindings;