Nodejs无法TCP/Parse长JSON文件

Jas*_*hen 4 javascript node.js

我有一个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"
                }
            ]
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我用来解析这个的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(){

});
Run Code Online (Sandbox Code Playgroud)

此JSON文件作为TCP数据包发送到我的节点服务器,后者又解析它.代码和功能在我的localhost环境中完美运行.但是,当我试图在我的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)
Run Code Online (Sandbox Code Playgroud)

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

jos*_*736 5

TCP提供字节流,而不是消息.

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

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

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