我已经开始构建PHP和Node Js应用程序以更新我的实时运动成绩。我的php和节点服务器与节点模块express,socket io和zeromq正常工作。我有一个从API接收到的大数据,在该文件中,我打包了php文件,并将json数据发送到节点服务器(通过zeromq),然后在节点js服务器文件中接收了该数据,该数据是从该节点发送到客户端的。现在,该设置可以很好地处理少量数据。但是,当文件很大时,节点服务器将无法继续处理,并显示以下错误。
这是我尝试通过节点服务器中的套接字io发送到客户端时遇到的错误
节点:../node_modules/nan/nan.h:822:Nan :: MaybeLocal Nan :: NewBuffer(char *,size_t,node :: Buffer :: FreeCallback,void *):断言`length <= imp :: kMaxLength && “缓冲区太大””失败。 中止(核心已弃用)
这是主要的node_socket.js
var express = require('express');
var app = express();
var fs = require('fs');
var options = {
key: fs.readFileSync('/etc/letsencrypt/live/example.com/privkey.pem'),
cert: fs.readFileSync('/etc/letsencrypt/live/example.com/fullchain.pem'),
ca: fs.readFileSync('/etc/letsencrypt/live/example.com/chain.pem')
};
var https = require('https').Server(options, app);
var zmq = require('zeromq')
, sock = zmq.socket('pull');
sock.bind('tcp://10.150.0.6:1111');
var io = require('socket.io')(https);
io.on('connection', function(socket){
socket.on('disconnect',function(){
console.log("client disconnected");
})
sock.on('message',function(msg){
console.log('work: %s', msg.toString());
socket.emit('latest_score',msg.toString());
});
});
https.listen(3333);
sock.on('connect', function(fd, ep) {console.log('connect, endpoint:', ep);});
console.log('App connected to port 3333');
请注意,该应用程序可以很好地处理小数据,但无法处理从php文件发送的大json数据。几天以来,我尝试了几种不同的方法,但是都没有成功。我还从fiverr.com雇用了几个node js开发人员,但他们也无法解决问题。我希望这里有人会指引我正确的方向。
答案 0 :(得分:1)
摘自缓冲区(https://nodejs.org/api/buffer.html)上的nodejs文档
buffer.constants.MAX_LENGTH#
Added in: v8.2.0
<integer> The largest size allowed for a single Buffer instance.
On 32-bit architectures, this value is (2^30)-1 (~1GB). On 64-bit architectures, this value is (2^31)-1 (~2GB).
This value is also available as buffer.kMaxLength.
因此,假设您使用的是64位系统,则您似乎一次发送了2GB以上的数据。假设您有一个很大的JSON数据数组,最简单的方法是将数组拆分为多个块,然后分别通过套接字发送它们。
所以在这里:
sock.on('message',function(msg){
console.log('work: %s', msg.toString());
socket.emit('latest_score',msg.toString());
});
您需要JSON.parse()数据,将其拆分,JSON.stringify()数据并分别通过套接字发送。
在此处查看如何拆分数组:Split array into chunks
更新:(由于评论) 如果您绝对不能拆分数据,则可以将其存储在php(数据库或文件)中,并构建REST api来查询数据。然后只需通过ZeroMQ和NodeJ发送文件/行的ID。然后,客户端必须调用REST API来获取实际数据。