如何使用 mysql 数据库中的 nodejs 和 socket.io 在网页上获得实时更新?

Posted

技术标签:

【中文标题】如何使用 mysql 数据库中的 nodejs 和 socket.io 在网页上获得实时更新?【英文标题】:How can I get real time update on a webpage using nodejs and socket.io from a mysql database? 【发布时间】:2018-06-07 22:00:18 【问题描述】:

我正在关注以下关于如何从 mysql 数据库中的 nodejs 和 socket.io 获取实时更新的教程。 http://markshust.com/2013/11/07/creating-nodejs-server-client-socket-io-mysql

该代码适用于网页。当我在两个浏览器上打开网页并单击“创建新记录”时,我在两个浏览器上都得到了更新。但是当我从 mysql 控制台手动将数据插入数据库时​​,我在网页上看不到更新。我怎样才能在网页上也获得此更新?

server.js 文件

var mysql = require('mysql')
// Let’s make node/socketio listen on port 3000
var io = require('socket.io').listen(3000)
// Define our db creds
var db = mysql.createConnection(
host: 'localhost',
user: 'root',
database: 'node'
)

// Log any errors connected to the db
db.connect(function(err)
    if (err) console.log(err)
)

// Define/initialize our global vars
var notes = []
var isInitNotes = false
var socketCount = 0

io.sockets.on('connection', function(socket)
// Socket has connected, increase socket count
socketCount++
// Let all sockets know how many are connected
io.sockets.emit('users connected', socketCount)

socket.on('disconnect', function() 
    // Decrease the socket count on a disconnect, emit
    socketCount--
    io.sockets.emit('users connected', socketCount)
)

socket.on('new note', function(data)
    // New note added, push to all sockets and insert into db
    notes.push(data)
    io.sockets.emit('new note', data)
    // Use node's db injection format to filter incoming data
    db.query('INSERT INTO notes (note) VALUES (?)', data.note)
)

// Check to see if initial query/notes are set
if (! isInitNotes) 
    // Initial app start, run db query
    db.query('SELECT * FROM notes')
        .on('result', function(data)
            // Push results onto the notes array
            notes.push(data)
        )
        .on('end', function()
            // Only emit notes after query has been completed
            socket.emit('initial notes', notes)
        )

    isInitNotes = true
 else 
    // Initial notes already exist, send out
    socket.emit('initial notes', notes)

)

客户端文件

<script 
src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js">
</script>
<script src="http://localhost:3000/socket.io/socket.io.js"></script>
<script>
$(document).ready(function()
    // Connect to our node/websockets server
    var socket = io.connect('http://localhost:3000');

// Initial set of notes, loop through and add to list
socket.on('initial notes', function(data)
    var html = ''
    for (var i = 0; i < data.length; i++)
        // We store html as a var then add to DOM after for efficiency
        html += '<li>' + data[i].note + '</li>'
    
    $('#notes').html(html)
)

// New note emitted, add it to our list of current notes
socket.on('new note', function(data)
    $('#notes').append('<li>' + data.note + '</li>')
)

// New socket connected, display new count on page
socket.on('users connected', function(data)
    $('#usersConnected').html('Users connected: ' + data)
)

// Add a new (random) note, emit to server to let others know
$('#newNote').click(function()
    var newNote = 'This is a random ' + (Math.floor(Math.random() * 100) + 1)  + ' note'
    socket.emit('new note', note: newNote)
)
)
</script>
<ul id="notes"></ul>
<div id="usersConnected"></div>
<div id="newNote">Create a new note</div>

【问题讨论】:

你有没有让这个工作?我在看同样类型的东西,遇到同样的问题 【参考方案1】:

这可能是因为您没有提交对 Socket.IO 的更新。你应该使用 io.commit('someMessage', data);当您从 msql cli 手动创建记录时。

如果有帮助,请告诉我!

【讨论】:

以上是关于如何使用 mysql 数据库中的 nodejs 和 socket.io 在网页上获得实时更新?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用socket.io mysql nodejs express删除帖子

从 Nodejs 中的 mySQL 获取数据时如何从 Async/await 函数获取返回值

如何解决 NodeJS 中的“TypeError:将循环结构转换为 JSON”

nodejs链接mysql 中的问题

nodejs连接mysql并进行简单的增删查改

使用 NodeJS Express 时将表单数据插入 MySQL 数据库