Node.js无法TCP /解析长JSON文件

我有一个如下的JSON文件。尽管文件本身看起来不必要地冗长,但我将其包含在内是有原因的。基本上,对我来说,我的文件太大了,无法通过TCP到达我的活动站点。

{
    "FormatNumber": 1,
    "Team_Types": [{
            "Teams": "EmmersonCod",
            "Channels": [{
                    "Team_Name": "Tanaka",
                    "Team_Members": 1,
                    "Team_Mascot": "Dolphin"
                },
                {
                    "Team_Name": "Drago",
                    "Team_Members": 2,
                    "Team_Mascot": "Lundgren"
                },
                {
                    "Team_Name": "Apollo",
                    "Team_Members": 3,
                    "Team_Mascot": "Crews"
                },
                {
                    "Team_Name": "Cobra",
                    "Team_Members": 4,
                    "Team_Mascot": "Kai"
                }
            ]
        },
        {
            "Teams": "Candy",
            "Channels": [{
                    "Team_Name": "Simson",
                    "Team_Members": 1,
                    "Team_Mascot": "The"
                },
                {
                    "Team_Name": "Rick",
                    "Team_Members": 2,
                    "Team_Mascot": "Sanchez"
                }
            ]
        },
        {
            "Teams": "FoxNews",
            "Channels": [{
                    "Team_Name": "David",
                    "Team_Members": 1,
                    "Team_Mascot": "Bannon"
                },
                {
                    "Team_Name": "Rickety",
                    "Team_Members": 2,
                    "Team_Mascot": "Crickett"
                },
                {
                    "Team_Name": "Lady",
                    "Team_Members": 3,
                    "Team_Mascot": "Madam"
                },
                {
                    "Team_Name": "Random",
                    "Team_Members": 4,
                    "Team_Mascot": "Words"
                },
                {
                    "Team_Name": "Put",
                    "Team_Members": 5,
                    "Team_Mascot": "Together"
                },
                {
                    "Team_Name": "To",
                    "Team_Members": 6,
                    "Team_Mascot": "Fill"
                },
                {
                    "Team_Name": "These",
                    "Team_Members": 7,
                    "Team_Mascot": "Blanks"
                },
                {
                    "Team_Name": "And",
                    "Team_Members": 8,
                    "Team_Mascot": "Illustrate"
                },
                {
                    "Team_Name": "The",
                    "Team_Members": 9,
                    "Team_Mascot": "Issues"
                },
                {
                    "Team_Name": "We",
                    "Team_Members": 10,
                    "Team_Mascot": "Are"
                },
                {
                    "Team_Name": "Going",
                    "Team_Members": 11,
                    "Team_Mascot": "Through"
                },
                {
                    "Team_Name": "At",
                    "Team_Members": 12,
                    "Team_Mascot": "This"
                },
                {
                    "Team_Name": "Very",
                    "Team_Members": 13,
                    "Team_Mascot": "Moment"
                },
                {
                    "Team_Name": "The",
                    "Team_Members": 14,
                    "Team_Mascot": "JSON"
                },
                {
                    "Team_Name": "Is",
                    "Team_Members": 15,
                    "Team_Mascot": "Too"
                },
                {
                    "Team_Name": "Long",
                    "Team_Members": 16,
                    "Team_Mascot": "For"
                },
                {
                    "Channl_Name": "My",
                    "Team_Members": 17,
                    "Team_Mascot": "TCP"
                },
                {
                    "Team_Name": "To",
                    "Team_Members": 18,
                    "Team_Mascot": "Go"
                }
            ]
        }
    ]
}

我用来解析的Node.js代码如下:

var express = require('express');
var net = require("net");
var fs = require("fs");
var request = require('request');
var app = express();
var server = net.createServer();
var pack;

app.use(function(req, res, next){
    res.header("Access-Control-Allow-Origin", "*");
    next();
});

server.on("connection", function(socket){
    pack = "";
    socket.setEncoding('utf8');
        socket.on("data", function(d){
            pack = JSON.parse(d);
            console.log(pack.Timestamp.LocalTimestamp);
            app.set('dee', d);
                app.get("/"+pack.FormatNumber, function(req, res){
                    res.writeHead(200, {'Content-Type': 'text/plain'});
                    res.write(req.app.get('dee'));
                    res.end();
                });
        });
        socket.once("close", function(){
            console.log("connection closed");
        });
});

server.on("error", function(){
    console.log("connection error");
});

server.listen(9000, function(){
    console.log("Server Listening to Port 9000");
});

app.listen(8081, function(){

});

该JSON文件以TCP数据包的形式发送到我的Node服务器,该服务器依次对其进行解析。该代码和功能可以在我的本地主机环境中完美运行。但是,当尝试通过Digitalocean Node.js服务器推送JSON文件时,出现以下错误。

undefined:57
                                        "Cha
                                         ^

SyntaxError: Unexpected token C
    at Object.parse (native)
    at Socket.<anonymous> 
    at emitOne (events.js:77:13)
    at Socket.emit (events.js:169:7)
    at readableAddChunk (_stream_readable.js:146:16)
    at Socket.Readable.push (_stream_readable.js:110:10)
    at TCP.onread (net.js:523:20)

如果我减少JSON数组中的对象数量,则将其传递到实时服务器即可。我不清楚为什么会这样。TCP数据包仅通过较小的JSON文件进行解析。

josh3736

TCP提供字节流,而不是message

尽管TCP通过IP数据包发送数据,但TCP并不是数据包协议。TCP套接字只是数据因此,将data事件视为逻辑消息是不正确的换句话说,socket.write一端不等于另一端的单个data事件。单个data事件可能包含多个消息,单个消息或仅消息的一部分。

好消息是这是一个已经解决了很多次的问题。我建议:

  • 使用旨在通过TCP传递JSON消息的库
  • 使用redis等作为发布订阅消息解决方案(此选项使您的应用更易于扩展)
  • 如果您知道两个应用程序将始终在同一台计算机上运行,​​则应使用node的内置IPC机制

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章