Node.js 当新用户连接时,上一个连接将成为新用户
我一直在玩NodeJS和socket.IO,我来自PHP开发,试图真正理解如何使用Node和socket.IO 我开始构建一个聊天应用程序,当我在不同的设备上测试它时,我注意到,例如,当我通过手机登录到另一个帐户时,浏览器窗口会更新,并获得与我登录手机时相同的用户 index.htmlNode.js 当新用户连接时,上一个连接将成为新用户,node.js,socket.io,Node.js,Socket.io,我一直在玩NodeJS和socket.IO,我来自PHP开发,试图真正理解如何使用Node和socket.IO 我开始构建一个聊天应用程序,当我在不同的设备上测试它时,我注意到,例如,当我通过手机登录到另一个帐户时,浏览器窗口会更新,并获得与我登录手机时相同的用户 index.html <!DOCTYPE html> <html> <head> <title>Socket.IO chat</title> <st
<!DOCTYPE html>
<html>
<head>
<title>Socket.IO chat</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body { font: 13px Helvetica, Arial; }
form { background: #000; padding: 3px; position: fixed; bottom: 0; width: 100%; }
form input { border: 0; padding: 10px; width: 90%; margin-right: 0.5%; }
form button { width: 9%; background: rgb(130, 224, 255); border: none; padding: 10px; }
#messages { list-style-type: none; margin: 0; padding: 0; }
#messages li { padding: 5px 10px; }
#messages li:nth-child(odd) { background: #eee; }
</style>
</head>
<body>
<div id="chatLogin">
<input type="text" name="password" id="username" placeholder="Username..." /><br>
<input type="password" name="password" id="password" placeholder="Password..." /><br>
<button id="chatLoginBtn">Login / Register</button>
</div>
<div id="chatWindow">
<ul id="messages"></ul>
<form action="">
<input id="m" autocomplete="off" /><button>Send</button>
</form>
</div>
<script src="/socket.io/socket.io.js"></script>
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script>
$(function () {
var socket = io();
$(document).ready(function(){
$("#chatWindow").hide();
$("#chatLoginBtn").click(function(){
socket.emit('loginForm', {
username: $("#username").val(),
password: $("#password").val()
});
});
});
socket.on('returnValue', function(msg) {
var html = '<ul id="messages"></ul>' +
'<form id="sendMsg" action="">' +
'<input id="m" autocomplete="off" /><button>Send</button>' +
'</form>';
$("#chatLogin").html("").hide();
$("#chatWindow").html(html).show();
$('#sendMsg').submit(function(e) {
e.preventDefault(); // prevents page reloading
var time = Date.now();
var msg = $("#m").val();
var data = [time, msg];
socket.emit('chat', data);
$('#m').val('');
return false;
});
});
socket.on('chat', function(msg){
$('#messages').append($('<li>').text(msg));
});
});
</script>
</body>
</html>
Socket.IO聊天
*{边距:0;填充:0;框大小:边框框;}
正文{字体:13px Helvetica,Arial;}
表单{background:#000;填充:3px;位置:固定;底部:0;宽度:100%;}
表单输入{边框:0;填充:10px;宽度:90%;右边距:0.5%;}
窗体按钮{宽度:9%;背景:rgb(130224255);边框:无;填充:10px;}
#消息{列表样式类型:无;边距:0;填充:0;}
#消息li{padding:5px 10px;}
#留言李:第n个孩子(奇数){背景:#eee;}
登录/注册
发送
$(函数(){
var socket=io();
$(文档).ready(函数(){
$(“#聊天窗口”).hide();
$(“#chatLoginBtn”)。单击(函数(){
socket.emit('loginForm'{
用户名:$(“#用户名”).val(),
密码:$(“#密码”).val()
});
});
});
socket.on('returnValue',函数(msg){
var html='
'+
'' +
“发送”+
'';
$(“#chatLogin”).html(“”.hide();
$(“#聊天窗口”).html(html).show();
$('#sendMsg')。提交(函数(e){
e、 preventDefault();//防止页面重新加载
var time=Date.now();
var msg=$(“#m”).val();
var数据=[时间,msg];
发出('chat',数据);
$('m').val('');
返回false;
});
});
socket.on('chat',函数(msg){
$(“#消息”).append($(“”).text(msg));
});
});
index.js
var app = require('express')();
var http = require('http').createServer(app);
var phpPass = require('node-php-password');
var mysql = require('mysql');
var io = require('socket.io')(http);
var cookieParser = require('cookie-parser');
var session = require('express-session');
// DECLARE the variables we will be using
// These does not change
let userCount = 0;
// These are declared to be later set
var displayName;
var userDataID;
// POOL MySQL Connection
var pool = mysql.createPool({
connectionLimit : 100,
host : 'localhost',
user : 'root',
password : '....',
port : '3306',
database : '....',
debug : false
});
// session & cookieParser
/*var sessionMiddleware = session({
secret: "keyboard cat"
});
io.use(function (socket, next) {
sessionMiddleware(socket.request, socket.request.res, next);
});
app.use(sessionMiddleware);
app.use(cookieParser());*/
app.get('/', (req, res) => {
res.sendFile(__dirname + '/index.html');
});
var hashPassword;
function checkUser(user, Password, userID) {
pool.getConnection(function(error,connection) {
connection.query("SELECT password FROM accounts WHERE `username` = '"+user+"' LIMIT 1",function(error,rows){
if (!error) {
var hashPassword = rows[0].password;
if (phpPass.verify(Password, hashPassword)) {
console.log(Password);
console.log(hashPassword);
console.log("Went well");
// UPDATE user database with current socketID
connection.query("UPDATE accounts SET `socketID` = '"+userID+"' WHERE `username` = '"+user+"'",function(error,result){
connection.release();
if (!error) {
connection.query("SELECT id,displayName,username,email,fullName,dateofBirth,created,lastSignedIn FROM accounts WHERE socketID = '"+userID+"' LIMIT 1",function(error,userData){
if (!error) {
displayName = userData[0].displayName;
userDataID = userData[0].id;
console.log("Current user: " + userData[0].displayName);
} else {
console.log("Error" + error);
}
});
console.log("No error" + result);
} else {
console.log("We found error" + error);
}
});
// send to function to gather all needed info from database and save for the current session
return true;
} else {
console.log("Wrong pass");
return false;
}
console.log(hashPassword);
} else {
console.log(error);
return false;
}
});
connection.on('error', function(error) {
});
});
return true;
};
io.on('connection', (socket) => {
var req = socket.request;
var userID = socket.id;
// When connection is inited
userCount++;
console.log('User connected' + userCount);
// Take the data from login and pass to check if it is valid
socket.on("loginForm", function(data){
const user = data.username,
pass = data.password;
//console.log(checkUser(user, pass));
if (checkUser(user, pass, userID)) {
io.emit('returnValue', 'hi');
}
});
function joinRoom(room) {
socket.join(room);
console.log("Joined " + room);
return io.emit('chat', "Joined new room " + room);
}
socket.on('join', (data) => {
socket.join(data);
console.log("Joined " + data);
});
socket.on('chat', (data) => {
/* Array: Data;
[0] Time
[1] Message
[2] socketID
[3] User
*/
var msg = data[1];
var time = data[0];
// Calc time
var date = new Date(time);
var hours = date.getHours();
var minutes = date.getMinutes();
var formatted = hours + ":" + minutes;
if (minutes < 10) return minutes = "0" + minutes;
var dateFormatted = "[" + formatted + "] ";
//data.push(user);
pool.getConnection(function(error,connection) {
connection.query("INSERT INTO `chat_messages` (userID, socketID, message, time) VALUES ('"+userDataID+"', '"+userID+"', '"+msg+"', '"+time+"')",function(error,rows){
connection.release();
if (!error) {
console.log("Success");
} else {
console.log(error);
}
});
});
if (msg.startsWith('/me')) return io.emit('chat', dateFormatted + displayName + msg.substring(3));
if (msg.startsWith('/join')) return joinRoom(msg.substring(6));
if (msg.startsWith('/rooms')) return console.log(io.sockets.adapter.rooms);
return io.emit('chat', dateFormatted + displayName + ' said: ' + msg);
//console.log(displayName + 'said:' + msg);
});
// When user disconnects
socket.on('disconnect', () => {
userCount--;
console.log('User disconnected!' + userCount);
});
});
http.listen(3000, () => {
console.log('Listening on *:3000');
});
var-app=require('express')();
var http=require('http')。createServer(应用程序);
var phpPass=require('node-php-password');
var mysql=require('mysql');
var io=require('socket.io')(http);
var cookieParser=require('cookie-parser');
var会话=需要(“快速会话”);
//声明我们将要使用的变量
//这些并没有改变
让userCount=0;
//这些将声明为稍后设置
变量显示名;
var-userDataID;
//池MySQL连接
var pool=mysql.createPool({
连接限制:100,
主机:“localhost”,
用户:'根',
密码:'..',
港口:'3306',
数据库:“…”,
调试:false
});
//会话与cookieParser
/*var sessionMiddleware=会话({
秘密:“键盘猫”
});
io.use(函数(套接字,下一个){
sessionMiddleware(socket.request,socket.request.res,next);
});
应用程序使用(sessionMiddleware);
使用(cookieParser())*/
应用程序获取(“/”,(请求,请求)=>{
res.sendFile(uu dirname+'/index.html');
});
var-hashPassword;
函数checkUser(用户、密码、用户ID){
pool.getConnection(函数(错误,连接){
connection.query(“从帐户中选择密码,其中'username`='”+user+“'LIMIT 1”,函数(错误,行){
如果(!错误){
var hashPassword=行[0]。密码;
if(phpPass.verify(Password,hashPassword)){
console.log(密码);
console.log(hashPassword);
日志(“进展顺利”);
//使用当前socketID更新用户数据库
connection.query(“更新帐户集`socketID`='”+userID+”,其中`username`='“+user+”,函数(错误,结果){
连接。释放();
如果(!错误){
connection.query(“选择id、displayName、用户名、电子邮件、全名、出生日期、已创建、上次登录的帐户,其中socketID=”“+userID+”“LIMIT 1”,函数(错误,userData){
如果(!错误){
displayName=userData[0]。displayName;
userDataID=userData[0].id;
console.log(“当前用户:+userData[0].displayName”);
}否则{
console.log(“错误”+错误);
}
});
console.log(“无错误”+结果);
}否则{
log(“我们发现错误”+错误);
}
});
//send to function可从数据库中收集所有需要的信息,并为当前会话保存
返回true;
}否则{
控制台日志(“错误传递”);
返回false;
}
console.log(hashPassword);
}否则{
console.log(错误);
返回false;
}
});
connection.on('error',函数(error){
});
});
返回true;
};
io.on('连接',(套接字)=>{
var req=socket.request;
var userID=socket.id;
//当连接被初始化时
userCount++;
log('User connected'+userCount);
//从登录中获取数据并通过以检查其是否有效
socket.on(“loginForm”,函数(数据){
const user=data.username,
pass=data.password;
//日志(checkUser(user,pass));
if(检查用户(用户、通行证、用户ID)){
io.emit('returnValue','hi');
}
});
功能室{
插座连接(房间);
console.lo