使用 socket.io 连接到带有套接字的 mysql 数据库时出错

Posted

技术标签:

【中文标题】使用 socket.io 连接到带有套接字的 mysql 数据库时出错【英文标题】:error when connecting to a mysql database with a socket using socket.io 【发布时间】:2021-04-05 13:22:17 【问题描述】:

我正在尝试连接到节点内的 mysql 数据库,并且我想在每次添加新记录时创建一个套接字(使用 socket.io),但是我收到以下错误。

错误:连接 ECONNREFUSED 139.0.0.1:3306 在 TCPConnectWrap.afterConnect [as oncomplete] (node:net:1133:16)

我是 socket.io 的新手,因此正在尝试在线示例中的代码以了解其工作原理。

这是我的代码

const app = require('http').createServer().listen(8000);
const mysql = require('mysql');
const io = require('socket.io')(app);

const db = mysql.createConnection(
    host: 'localhost',
    user: 'root',
    password: 'root',
    database: 'ExampleLogin'
);

 db.connect((err) => 
     if(err) console.log(err);
     console.log("Connected Successfully To The Database");
);

//db.connect();

console.log('Server running on port 8000');

const prev_id = 0;

io.sockets.on('connection', (socket) => 
    socket.emit('greeting', 'Hello');
    socket.on('check_podcast', (data) => 
        const uid = data['uid'];
        const query = "SELECT * FROM podcastTable WHERE id =" +uid;
        connection.query(query, (err, rows, fields) => 
            if (err) throw err;
            if(rows[0].id > prev_id) 
                socket.emit('new_podcast', rows[0]);
                prev_id = rows[0].id;
            
        );
    );
    db.end();
);

当我运行我的代码时,我会在终端中得到以下输出

【问题讨论】:

ECONNREFUSED - 连接被拒绝意味着在提供的地址上没有数据库服务正在侦听。检查您的数据库进程是否正在运行。 【参考方案1】:

我可以看到 2 个问题

    您的数据库服务器拒绝连接 查询对象无效。

首先请检查您的 MySQL 凭据是否正确,MySQL 正在运行, 是否允许您的用户从指定的主机名进行连接?

一旦上述问题得到解决,下一个问题就是“connection.query”,

io.sockets.on('connection', (socket)

上面的live“connection”是一个事件,跟MySQL查询无关。

您的查询应该是

db.query(query, (err, rows, fields) => 

'db' 对象保存 MySQL 的连接信息。

这是服务器端和客户端的完整工作代码

// server.js
const HTTP = require('http');
const mysql = require('mysql');
server = HTTP.createServer();
var io = require('socket.io')(server,
    pingInterval: 5000,
    pingTimeout: 2500,
    cookie: false
);
server.listen(8080);

var MySQLConnection = mysql.createConnection(
    host: "localhost",
    user: "yourusername",
    password: "yourpassword",
    database: "mydb"
);

MySQLConnection.connect(function(err) 
    if (err) 
        console.log('MySQL COnnection Error --> ' + err);
    
    else
        console.log("MySQL Connected Successfully");
    
);

io.on('connection',function(socket)
    socket.emit('greeting', 'Hello');
    socket.on('checkUser', (data) => 
        const email = data['email'];
        const query = "SELECT * FROM table1 WHERE email ='" +email+"'";
        MySQLConnection.query(query, (err, result, fields) => 
            if (err) 
                console.log('MySQL Query Error --> '+ err);
            
            else
                console.log(result);
            
        );
    );
);

这里是客户端

<!-- client.html -->
<script src="http://SERVERIP:8080/socket.io/socket.io.js"></script>
<script>
var socket = io('http://SERVERIP:8080', 
    transports: [ 'websocket' ],
    'reconnection': true,
    'reconnectionDelay': 500,
    'reconnectionDelayMax': 1000,
    'reconnectionAttempts': 100
);

socket.on('connect', onConnect);
socket.on('greeting', onGreeting);


function onConnect()
    console.log('Connected Successully...'); 

function onGreeting(DATA)
    console.log('onGreeting --> DATA --> ' + DATA); 
    var sendData = 
        email: 'ali@email-address.co.uk'
    
    socket.emit('checkUser',sendData);


</script>

【讨论】:

这没有帮助,我无法理解,因为我可以使用 php 连接到数据库。 这很奇怪,节点应用程序和 PHP 脚本是否在同一台服务器上运行并使用相同的凭据? 我能够解决这个问题,因为我使用 MAMP 运行我的服务器我需要将以下行添加到我的数据库连接 'socketPath: '/Applications/MAMP/tmp/mysql/mysql .sock''

以上是关于使用 socket.io 连接到带有套接字的 mysql 数据库时出错的主要内容,如果未能解决你的问题,请参考以下文章

chrome 扩展背景 - socket.io 连接到 https 而不是 http

在将用户连接到服务器之前,如何等待 Socket.IO 建立套接字连接?

通过反向代理服务器将socket.io android客户端连接到套接字服务器

通过 PHP 连接到 socket.io(nodejs)

Socket.io 不会按需关闭套接字(并且不允许我的 swift 应用程序再次重新连接到 node.js 服务器)

使用带有webpack的socket.io连接到GDAX websocket api