我有socket.io和nodejs的编写代码,可以从数据库中获取值并将其发送给客户端,而无需使用setInterval进行刷新。它工作正常,但我不想使用setInterval函数。因为有时我的数据库以小时为单位更改,有时以分钟为单位,有时以毫秒为单位。所以我不想使用setInterval函数。我只希望数据库值更改时它会自动更新。而已。我有点卡在里面。
var express = require('express');
var app = express();
var server = require('http').createServer(app);
var io = require('socket.io').listen(server);
var mysql = require('mysql');
users = [];
connections = [];
disconnection = [];
var connection = mysql.createConnection({
host: 'localhost',
user: 'root',
password: '',
database: 'test'
});
connection.connect(function(error){
if(!!error) {
console.log('Error in connection');
} else {
console.log('Database Connected');
}
});
server.listen(process.env.PORT || 3000);
console.log('Server Running...');
app.get('/', function(req, res) {
res.sendFile(__dirname + '/index.html');
});
io.sockets.on('connection', function(socket) {
connections.push(socket);
console.log('Connected: %s socket connected',
connections.length);
setInterval(function() {
connection.query('select value from piechart',
function(error, rows, fields) {
if(rows.length>0) {
io.sockets.emit('new message', {msg: rows});
//io.sockets.emit('new message', {msg:
'Change.'});
//console.log('Value is fetched from database');
//console.log(rows);
} else {
alert('what will happend');
}
//connection.release();
});
}, 3000);
});
答案 0 :(得分:0)
您应该将时间间隔移出套接字范围,并将其设为全局。
然后进行一个间隔循环,以获取值并在从上次获取值更改到所有已连接的套接字客户端的情况下全局发出该值。
您声明要避免间隔,但最后需要一个间隔。
您可以签出mysql-events
Node JS NPM程序包,用于监视MySQL数据库并运行回调 在匹配的事件上。
另一种解决方法是,找到所有更新值的事件,并使它们通知您的NodeJS流程。
但是,如果它具有超出您控制范围的组件,那么这可能很难(例如:无法向更新数据库的其他进程添加代码)