Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何解码节点中的gtfs协议_Javascript_Node.js_Gtfs_Protocol Buffers - Fatal编程技术网

Javascript 如何解码节点中的gtfs协议

Javascript 如何解码节点中的gtfs协议,javascript,node.js,gtfs,protocol-buffers,Javascript,Node.js,Gtfs,Protocol Buffers,我正在尝试使用解析triments gtfs数据 这是我到目前为止的代码,它正确地解析了.proto文件并创建了构建器,并且具有所有预期的属性和方法,当我试图用它解码任何数据时,它会抛出一个错误 Error: Data must be corrupt: Buffer overrun 原始文件来自 感谢Brian Ferris,我能够解析标题的第一部分gtfs\u realtime\u version:“1”,但解析器无法解析下一个组件(时间戳uint64) 多亏了这并没有回答您的问题,但您可以

我正在尝试使用解析triments gtfs数据

这是我到目前为止的代码,它正确地解析了.proto文件并创建了构建器,并且具有所有预期的属性和方法,当我试图用它解码任何数据时,它会抛出一个错误

Error: Data must be corrupt: Buffer overrun
原始文件来自

感谢Brian Ferris,我能够解析标题的第一部分
gtfs\u realtime\u version:“1”
,但解析器无法解析下一个组件(时间戳uint64)


多亏了

这并没有回答您的问题,但您可以使用类似url的url在文本中获取RT提要


还可以看看模块。

我不是节点专家,但GTFS实时提要的根消息类型是“FeedMessage”:

您似乎试图将提要解析为“警报”消息:

console.log(transit.Alert.decode(res.body))


也许可以尝试将警报更改为FeedMessage,看看会发生什么?

我可以通过强制
请求
模块使用空编码,从而确保它返回缓冲区而不是字符串来实现这一点(无论如何,对于纽约MTA源)。像这样:

request({
    url: 'http://developer.trimet.org/ws/V1/FeedSpecAlerts/?appID=618F30BB3062F39AF24AED9EC'
    encoding: null
}, parse)

然后,解析似乎工作正常。

在搜索您遇到的同一问题时,我一直在查找您的问题,希望我能帮助其他人。在互联网上搜索了很长时间之后,我想出了一些有效的方法。直到有一个工作提要被解码,我才完全理解数据

这在很大程度上似乎与数据的读取方式有关。我不是NodeJS人,所以我不知道为什么,但这取决于如何使用
http
读取数据,而不是
request
进行解码。我无法使用相同的方法来处理数据的
request

其中一部分是我从中发现的,但我还不太了解如何使用
protobufjs
,因此我在这里为其他人提供了一个工作示例。希望能有帮助

var ProtoBuf = require('protobufjs');
var http = require("http");

// create a protobuf decoder
var transit = ProtoBuf.protoFromFile('gtfs-realtime.proto').build('transit_realtime');
// your protobuf binary feed URL
var feedUrl = "...";    

// HTTP GET the binary feed
http.get(feedUrl, parse);

// process the feed
function parse(res) {
    // gather the data chunks into a list
    var data = [];
    res.on("data", function(chunk) {
        data.push(chunk);
    });
    res.on("end", function() {
        // merge the data to one buffer, since it's in a list
        data = Buffer.concat(data);
        // create a FeedMessage object by decooding the data with the protobuf object
        var msg = transit.FeedMessage.decode(data);
        // do whatever with the object
        console.log(msg);
    }); 
});

从谷歌开发者页面。 Google现在提供了Node.js npm模块,使事情变得非常简单:

npm install gtfs-realtime-bindings
下面是谷歌的代码片段()


我之所以使用res.body,是因为它是一个缓冲区,而传入的body是一个字符串。您解决了这个问题了吗?我在查看MTA subway gtfs-r提要时遇到了完全相同的问题。不,对不起,我放弃了,当时我的结论是js解析器不符合规范,但可能其中一些已经更新了,因为我没有在文档中看到文本链接。它给了我一些工作的依据,看看输出应该是什么可能会让我更容易调试这个问题。node gtfs模块非常酷,但我主要是在做这个,因为我想看看protobufs如何与node一起工作。我并没有真正朝着任何特定的目标努力,但如果我能让事情顺利进行,我可能会围绕trimet api编写一个简单的包装器,并将其放到npmThank上!这是朝着正确方向迈出的一步。不幸的是,我现在得到了一个新的错误:数据必须被破坏:缓冲区溢出。我将更新这个问题:我如何在我的angularjs项目中获得同样的好处?
npm install gtfs-realtime-bindings
var GtfsRealtimeBindings = require('gtfs-realtime-bindings');
var request = require('request');

var requestSettings = {
  method: 'GET',
  url: 'URL OF YOUR GTFS-REALTIME SOURCE GOES HERE',
  encoding: null
};
request(requestSettings, function (error, response, body) {
  if (!error && response.statusCode == 200) {
    var feed = GtfsRealtimeBindings.FeedMessage.decode(body);
    feed.entity.forEach(function(entity) {
      if (entity.trip_update) {
        console.log(entity.trip_update);
      }
    });
  }
});