您可以使用socket.io向客户端发送查询结果。然后,您可以将结果添加到客户端的HTML中。假设您的'客户'表具有以下结构:
name varchar(20)
password varchar(20)
并且您的html中有空元素。您可以发出“客户”事件在服务器:
con.query("SELECT * FROM customers", function (err, results, fields) {
if (err) throw err;
console.log(result);
// we only send results as we know the fields
socket.emit('customers', results);
});
而在客户端的代码(哈巴狗或玉):
script.
let socket = io();
socket.on('customers', data => {
for (let i = 0, max = data.length; i < max; i++) {
document.getElementById('customers').innerHTML += data[i].user + ' ' + data[i].password + '<br/>;
}
});
如果你不知道表中的字段(这几乎是不可能的,是不是),你可以同时使用results
和fields
由查询,如下面的例子返回:
server.js:
const express = require('express');
const app = express();
const http = require('http').Server(app);
const io = require('socket.io')(http);
const mysql = require('mysql');
let con = mysql.createPool({
connectionLimit: 10,
host: 'localhost',
user: 'root',
password: '',
database: 'mydb'
});
io.on('connection', function (socket) {
console.log('client connected');
socket.on('show',() => {
con.query('SELECT * FROM customers', (err, results, fields) => {
if (err) {
throw err;
}
//we send both: results and fields here as we don't know the fields
socket.emit('customers', {results: results, fields: fields});
});
});
});
http.listen(3000, function(){
console.log('server listening on *:3000');
});
app.set('views', __dirname);
app.set('view engine', 'pug');
app.get('/', (req,res) => {
res.render('index');
});
index.pug:
doctype html
html
head
meta(charset="UTF-8")
script(src="/socket.io/socket.io.js")
body
style.
table, th, td {
border: 1px solid black;
border-collapse: collapse;
}
th, td {
padding: 5px;
}
#mysql {
margin-top: 10px;
}
div
h3 Query results
button(id='show') Show
#mysql
script.
let socket = io();
socket.on('customers', data => {
let mysql = document.getElementById('mysql');
let table = document.createElement('TABLE');
mysql.appendChild(table);
let tableHead = document.createElement('THEAD');
table.appendChild(tableHead);
let tr = document.createElement('TR');
tableHead.appendChild(tr);
for (let i = 0, max = data.fields.length; i < max; i++) {
let th = document.createElement('TH');
th.width = '75';
th.appendChild(document.createTextNode(data.fields[i].name));
tr.appendChild(th);
}
let tableBody = document.createElement('TBODY');
table.appendChild(tableBody);
for (let i = 0, max = data.results.length; i < max; i++) {
let tr = document.createElement('TR');
for (let k = 0, max = data.fields.length; k < max; k++) {
let td = document.createElement('TD');
td.appendChild(document.createTextNode(data.results[i][data.fields[k].name]));
tr.appendChild(td);
}
tableBody.appendChild(tr);
}
});
document.getElementById('show').addEventListener('click',() => {
socket.emit('show');
});
在这里,我们从data.fields
检索关于表的字段信息,并在建表使用它。所以我们只需要访问数据库并知道表的名字。