gpt4 book ai didi

javascript - 未知的 node.js 和 websockets 服务器停止。谁修改我的代码?

转载 作者:行者123 更新时间:2023-11-29 21:57:17 25 4
gpt4 key购买 nike

我已经编写了我的应用程序,现在我已经激活了 New Relic,它每 30 分钟 ping 我的应用程序以保持我的服务器处于事件状态 (heroku)。否则之前服务器会闲置,然后在第一个请求时花费大量时间重新启动。

我正在运行一个 socket.io 服务器,我现在面临的问题是,服务器运行很长时间后,它会陷入对命名空间的响应。该应用程序不会给出任何 fatal error ,它会继续运行,但只是停止应答。它继续照常工作(仍然检测并记录新连接的客户端),但只是不发送消息。

日志上没有什么奇怪的。

您能帮忙检查一下我的代码是否确实做了一些不应该做的错误并且可能会产生问题的事情吗? (例如听众太多等)

我对我的代码做了一些总结,所以可能会有一些愚蠢的语法错误,但流程应该是这样的。所有内容都重复 4,因为我有 4 个命名空间和 4 个不同的查询。

var app = require('express')();
var http = require('http').Server(app);
var cors = require('cors');
var io = require('socket.io')(http);
var PORT = process.env.PORT || 8080;
var sensorSocket = io.of('/namespace1'); //This gives back all the sensor at once with just now values.
var oldata = [];
var intervalRefresh=300;

app.use(cors());
var mysql = require('mysql');
var connectionsArray = [];
var connection = mysql.createConnection({
host: 'xxx',
user: 'xxx',
password: 'xxx',
database: 'xxx',
port: xx,
dateStrings: 'date'
})

//websockets creation/connection

app.get('/', function (req, res) {
res.sendFile(__dirname + '/client.html');
});

http.listen(PORT, function () {
console.log('\n\n\n\n listening on port: %s', PORT);
});

io.of('/namespace1').on('connection', function (socket) {
newconnectionSensors = 1;
console.log("Client id: %s connected on /sensors", socket.id);
console.log(io.of('/sensors').sockets.length);
socket.on('disconnect', function () {
console.log("Just left the ship grrarr : %s", socket.id);
});
});

io.of('/namespace2').on('connection', function (socket) {
[..Similar to the previous one..]
});


io.of('/namespace3').on('connection', function (socket) {
[..Similar to the previous one..]
});


io.of('/namespace4').on('connection', function (socket) {
[..Similar to the previous one..]
});

//Above here I do the same request every 300ms to the db and if there is any change, sends it into the client.

var CheckDB = setInterval(function (sensorSocket) {
if (io.of('/namespace1').sockets.length > 0) {
var query = connection.query('Query...'),

data = []; // this array will contain the result of our db query
query
.on('error', function (err) {
// Handle error, and 'end' event will be emitted after this as well
console.log(err);
})
.on('result', function (result) {
data.push(result);
})
.on('end', function () {
if ((JSON.stringify(oldata) != JSON.stringify(data)) || newconnection == 1) { //if new data is different than the old data, update the clients
io.of('/namespace1').emit('message', dataSensors, io.of('/namespace1').sockets.id);
newconnection = 0;
oldata = data.slice(0); //copy of data to oldata
}

});

}

}, intervalRefresh);

var CheckDB2 = setInterval(function (sensorSocket) {
[..Similar to the previous one..]
}, intervalRefresh);

var CheckDB3 = setInterval(function (sensorSocket) {
[..Similar to the previous one..]
}, intervalRefresh);

var CheckDB4 = setInterval(function (sensorSocket) {
[..Similar to the previous one..]
}, intervalRefresh);

最佳答案

发现错误。

真正的错误是我没有真正清楚 NodeJS 的非阻塞概念,所以在代码中我没有等待 MySQL 服务器的答案,而是只是向服务器发出查询,所以结果我们将在下类后到达。

我已经通过进行伪装来解决这个问题。基本上我添加了一个 var (queryexecuting) 来检查查询是否已完成执行。

var CheckDB = setInterval(function (sensorSocket) {
if (io.of('/namespace1').sockets.length > 0 && queryexecuting==0) { //If there are connected clients and there is no query executing.
queryexecuting=1; //Means the query is working
var query = connection.query('Query...'),

data = [];
query
.on('error', function (err) {
console.log(err);
})
.on('result', function (result) {
data.push(result);
})
.on('end', function () {
if ((JSON.stringify(oldata) != JSON.stringify(data)) || newconnection == 1) {
io.of('/namespace1').emit('message', dataSensors, io.of('/namespace1').sockets.id);
newconnection = 0;
oldata = data.slice(0);
}
queryexecuting=0; //Means the query has been finished
});

}

}, intervalRefresh);

关于javascript - 未知的 node.js 和 websockets 服务器停止。谁修改我的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33017734/

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