我做了一个简单的登录工作,并将一个小型数据库连接到我的服务器。只要用户正确登录,就会启动Web套接字连接。但是,当我在客户端进行身份验证后建立套接字连接时,我想向刚刚打开的套接字添加信息,以便跟踪与我的服务器有连接的所有用户的名称。我尝试了很多不同的方式,最终放弃了。这是我的客户代码:
function authenticate()
{
axios.post('/login', {
Username: document.getElementById("username").value,
Password: document.getElementById("password").value
})
.then(function (response) {
let socket=io();
/*console.log(response.data[0].ClientFirstName +
response.data[0].ClientLastName);*/
socket.on('connect', function(){ <-this event doesn't fire
console.log("connect"); <-is not displayed in the browser's console
})
window.location.replace('/public/Main.html');
})
.catch(function (error) {
console.log(error);
});
}
这是我的服务器代码:
const Express=require('express');
const path=require('path');
var app = Express();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var mysql = require('mysql');
var con = mysql.createConnection({
host: "localhost",
user: "root",
password: "",
database: "ChatDB"
});
con.connect(function(err) {
if (err)throw err;
console.log("Connected!");
});
app.use(Express.json())
app.use('/public', Express.static(path.join(__dirname, 'public')));
app.get('/', function(req, res){
res.sendFile(__dirname + '/public/index.html');
});
app.post('/login', function(req, res){
let a=req.body.Username;
let b=req.body.Password;
let query="SELECT ClientID, ClientFirstName, ClientLastName FROM Client WHERE ClientUsername=\'" + a + "\' AND ClientPassword=\'" + b + "\';";
con.query(query, function (err, rows) {
if (err){
throw err;
}
else if(rows.length)
{
console.log(rows);
res.json(rows);
}
})
});
io.on('connection', function(socket){
console.log('a user connected');
socket.on('disconnect', function(){
console.log('user disconnected');
});
})
http.listen(3000, function(){
console.log('listening on *:3000')
});
我尝试在客户端中使用它来尝试获取数据,但它不起作用或者至少我不知道如何在服务器端使用它:
let socket=io.connect("localhost:3000", {firstname: "adsfasdf", lastname:
"asdfsadf"});
任何帮助将不胜感激
答案 0 :(得分:0)
到目前为止,我们可以带你到这里,而不仅仅是为你做这件事。你看过真正有帮助的tutorial on the Socket.io website?
吗?关键是要意识到在您的客户端和服务器上来回沟通。您的一端有emit
或broadcast
条消息,而另一方则是on
。
因此,在您的客户端中,只有在用户登录后才会对您的套接字进行initiaziling,然后才会在.then()
来电的axios
内进行初始化。您可能希望在其他位置初始化套接字,然后可以添加侦听器并在您选择的任何位置发送消息。
这是一个基本的例子:
<强>客户端强>:
//initialize socket
const socket = io();
//add all your listeners outside of functions and call other functions in response
io.on('user added', function(user) { console.log({newUser: user}) })
function authenticate() {
axios(...).then(response=>{
let userName = //some data you got back from response
//send a message to the server who will broadcast
socket.emit('new user', userName);
})
}
服务器强>
// think of how you want to handle persistence
const users = [];
io.on('connection', function(socket){
console.log('a user connected');
// the server listeners for client initiated messages and responds
socket.on('new user', function(user) {
users.push(user);
//tell everyone a new user joined
io.emit('user added', user);
});
socket.on('disconnect', function(){
console.log('user disconnected');
});
})