gpt4 book ai didi

javascript - Nodejs 无法 TCP/解析长 JSON 文件

转载 作者:搜寻专家 更新时间:2023-10-31 23:07:37 24 4
gpt4 key购买 nike

我有一个 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 服务器, Node 服务器依次解析它。代码和功能在我的本地主机环境中完美运行。但是,当尝试将我的 JSON 文件推送到我的 Digitalocean Node.js 服务器时,出现以下错误。

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 文件进行解析。

最佳答案

TCP provides a stream of bytes, not messages .

Despite the fact that TCP sends its data over IP packets, TCP is not a packet protocol. A TCP socket is simply a stream of data. Thus, it is incorrect to view the data event as a logical message. In other words, one socket.write on one end does not equate to a single data event on the other. A single data event might contain multiple messages, a single message, or only part of a message.

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

  • 使用a library用于通过 TCP 传递 JSON 消息。
  • 使用诸如 redis 之类的东西作为发布-订阅消息传递解决方案(此选项使您的应用更易于扩展)
  • 如果您知道您的两个应用程序将始终在同一台机器上运行,您应该使用 Node 的 built-in IPC mechanism .

关于javascript - Nodejs 无法 TCP/解析长 JSON 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48471139/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com