1、前言 html
一、最近在開發先後臺分離項目的時候用到了socket.io實現了在線聊天的功能、文本記錄一下項目中的注意點。前端
第二節: 定義服務端操做socket.io的方法,監聽前端用戶聊天和登陸express
2、主要知識 框架
(1)下載並安裝socket.io插件 mongoose
npm i --save socket.io
(2)使用node中的express框架下面將單獨操做socket.io插件的方法封裝到一個文件夾中。
在bin中鏈接socket.io
(3)第一步:使用socket.io去監聽服務端
在socketio.js中封裝getSocketio的方法用來監聽服務端:
var socketio = {} var socket_io = require('socket.io') //獲取io socketio.getSocketio = function(server){ var io = socket_io.listen(server) io.sockets.on('connection', socket=>{ console.log('鏈接成功') const socketId = socket.id } }
在bin/www文件夾下載入和調用剛剛定義的監聽服務端的方法
第二節定義服務端操做socket.io的方法,監聽前端用戶聊天和登陸
(1)新建一個socketId對象,當有用戶登陸的時候會爲每個用戶隨機分配一個惟一的socketid.
let express = require('express'); let mongoose = require('mongoose'); module.exports = new mongoose.Schema({ socketid:String, //隨機分配的socketid username:String //登陸用戶的用戶名 });
(2)在socketid文件夾下面封裝一個保存用戶socketId的方法
let Idtoid = require('../Models/Idtoid') module.exports = class socketHandler{ static async savaUserSocketId(username, socketId){ //保存用戶的id和socketid await Idtoid.findOne({ username: username }).then((rs)=>{ if(!rs){//若是不存在當前用戶就新建一個 new Idtoid({ username: username, socketid: socketId }).save().then(()=>{ }) }else { Idtoid.update({ username: username }, { socketid: socketId }).then(()=>{ }) } }) } }
(3)實現監聽登陸和監聽聊天的邏輯
/* 封裝socket.io,是爲了獲取server以便監聽 */ let Idtoid = require('../Models/Idtoid') let socketHandler = require('./socketioHander.js'); //socket要實現的具體邏 var socketio = {} var socket_io = require('socket.io') //獲取io socketio.getSocketio = function(server){ var io = socket_io.listen(server) io.sockets.on('connection', socket=>{ console.log('鏈接成功') const socketId = socket.id //監聽用戶登陸,爲每個登陸用戶分配一個socketid socket.on('login', (username)=>{ console.log('有用戶登陸') //調用保存socketid的方法 socketHandler.savaUserSocketId(username, socketId) }) //監聽用戶聊天,data是前端傳來的數據 socket.on('chat', (data)=>{ console.log('有用戶發起聊天啦') console.log(data) Idtoid.findOne({ username: data.to_user }).then((rs)=>{ //給對應的人發消息 io.to(rs.socketid).emit('receiveMsg', { from_user: data.from_user, message: data.message, time: data.time, avater:data.avater, _id:data._id }) }) }) }) } module.exports = socketio
(1)在index.html文件中引入而且使用
(2)用戶登陸時觸發
(3)私聊時觸發