如何使用 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