如何使用 socket.io 从 express node.js 服务器发送数据
How to send data from the express node.js server with socket.io
我正在学习如何使用 node.js、express 和 socket.io。
我想每隔一段时间从服务器向客户端发送 json 格式的查询结果。我创建了函数 intervalFunc
来做到这一点。
顺便说一下,它不起作用。
这是我在 index.js
中的代码:
var express = require('express');
var socket = require('socket.io');
var app = express();
//php package
var phpExpress = require('php-express')({
binPath: 'php'
});
// set view engine to php-express
app.set('views', './views');
app.engine('php', phpExpress.engine);
app.set('view engine', 'php');
// routing all .php file to php-express
app.all(/.+\.php$/, phpExpress.router);
//App setup
var server = app.listen(4000, function() {
console.log('listening on requests on port 4000');
});
//Static files
app.use(express.static('public'));
//Socket setup
var io = socket(server);
io.on('connection', function(socket) {
console.log('made socket connection', socket.id);
socket.on('chat', function(data) {
io.sockets.emit('chat', data);
});
socket.on('typing', function(data) {
socket.broadcast.emit('typing', data);
});
});
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'xxx',
password : 'xxx',
database: "xxx"
});
connection.connect();
//function not working
function intervalFunc() {
connection.query('SELECT prov_id, prov_nome FROM provincie', function(err, rows, fields) {
if (err) throw err; //error
console.log('The solution is:', rows);
io.sockets.emit('query_res', rows);
});
}
setInterval(intervalFunc, 1500);
connection.end();
我收到的错误位于 if (err) throw err;
.
函数内的 if
这是错误的异常:
C:\xampp\htdocs\socketio_project\index.js:60
if (err) throw err;
^
Error: Cannot enqueue Query after invoking quit.
at Protocol._validateEnqueue (C:\xampp\htdocs\socketio_project\node_modules\mysql\lib\protocol\Protocol.js:215:16)
at Protocol._enqueue (C:\xampp\htdocs\socketio_project\node_modules\mysql\lib\protocol\Protocol.js:138:13)
at Connection.query (C:\xampp\htdocs\socketio_project\node_modules\mysql\lib\Connection.js:198:25)
at Timeout.intervalFunc [as _onTimeout] (C:\xampp\htdocs\socketio_project\index.js:59:16)
at listOnTimeout (internal/timers.js:549:17)
at processTimers (internal/timers.js:492:7) {
code: 'PROTOCOL_ENQUEUE_AFTER_QUIT',
fatal: false
}
[nodemon] app crashed - waiting for file changes before starting...
可以帮忙吗?
看起来您的 connection
已关闭,然后 query
在驱动程序中发送/排队。 Node.js 是异步的,这意味着 connection.end
发生在 connection.query
.
之前
您可以尝试这样的操作(此处只粘贴了相关部分):
var connection = mysql.createConnection({
host : 'localhost',
user : 'xxx',
password : 'xxx',
database: "xxx"
});
//function not working
function intervalFunc() {
connection.connect(); // <-- connect each time (maybe pool the connection?)
connection.query('SELECT prov_id, prov_nome FROM provincie', function(err, rows, fields) {
if (err) throw err; //error
console.log('The solution is:', rows);
io.sockets.emit('query_res', rows);
connection.end(); // <-- close the connection here if the query was successful
});
}
setInterval(intervalFunc, 1500);
// no connection.end here <---
看起来 npm mysql 包的维护者在这里进行了更详细的解释:https://github.com/mysqljs/mysql/issues/1296
我正在学习如何使用 node.js、express 和 socket.io。
我想每隔一段时间从服务器向客户端发送 json 格式的查询结果。我创建了函数 intervalFunc
来做到这一点。
顺便说一下,它不起作用。
这是我在 index.js
中的代码:
var express = require('express');
var socket = require('socket.io');
var app = express();
//php package
var phpExpress = require('php-express')({
binPath: 'php'
});
// set view engine to php-express
app.set('views', './views');
app.engine('php', phpExpress.engine);
app.set('view engine', 'php');
// routing all .php file to php-express
app.all(/.+\.php$/, phpExpress.router);
//App setup
var server = app.listen(4000, function() {
console.log('listening on requests on port 4000');
});
//Static files
app.use(express.static('public'));
//Socket setup
var io = socket(server);
io.on('connection', function(socket) {
console.log('made socket connection', socket.id);
socket.on('chat', function(data) {
io.sockets.emit('chat', data);
});
socket.on('typing', function(data) {
socket.broadcast.emit('typing', data);
});
});
var mysql = require('mysql');
var connection = mysql.createConnection({
host : 'localhost',
user : 'xxx',
password : 'xxx',
database: "xxx"
});
connection.connect();
//function not working
function intervalFunc() {
connection.query('SELECT prov_id, prov_nome FROM provincie', function(err, rows, fields) {
if (err) throw err; //error
console.log('The solution is:', rows);
io.sockets.emit('query_res', rows);
});
}
setInterval(intervalFunc, 1500);
connection.end();
我收到的错误位于 if (err) throw err;
.
if
这是错误的异常:
C:\xampp\htdocs\socketio_project\index.js:60
if (err) throw err;
^
Error: Cannot enqueue Query after invoking quit.
at Protocol._validateEnqueue (C:\xampp\htdocs\socketio_project\node_modules\mysql\lib\protocol\Protocol.js:215:16)
at Protocol._enqueue (C:\xampp\htdocs\socketio_project\node_modules\mysql\lib\protocol\Protocol.js:138:13)
at Connection.query (C:\xampp\htdocs\socketio_project\node_modules\mysql\lib\Connection.js:198:25)
at Timeout.intervalFunc [as _onTimeout] (C:\xampp\htdocs\socketio_project\index.js:59:16)
at listOnTimeout (internal/timers.js:549:17)
at processTimers (internal/timers.js:492:7) {
code: 'PROTOCOL_ENQUEUE_AFTER_QUIT',
fatal: false
}
[nodemon] app crashed - waiting for file changes before starting...
可以帮忙吗?
看起来您的 connection
已关闭,然后 query
在驱动程序中发送/排队。 Node.js 是异步的,这意味着 connection.end
发生在 connection.query
.
您可以尝试这样的操作(此处只粘贴了相关部分):
var connection = mysql.createConnection({
host : 'localhost',
user : 'xxx',
password : 'xxx',
database: "xxx"
});
//function not working
function intervalFunc() {
connection.connect(); // <-- connect each time (maybe pool the connection?)
connection.query('SELECT prov_id, prov_nome FROM provincie', function(err, rows, fields) {
if (err) throw err; //error
console.log('The solution is:', rows);
io.sockets.emit('query_res', rows);
connection.end(); // <-- close the connection here if the query was successful
});
}
setInterval(intervalFunc, 1500);
// no connection.end here <---
看起来 npm mysql 包的维护者在这里进行了更详细的解释:https://github.com/mysqljs/mysql/issues/1296