使用 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客户端连接到套接字服务器