vue+mongoose+node.js項目總結第六篇_express框架中使用socket.io插件實如今線聊天功能(準備篇)

1、前言                                                                             html

一、最近在開發先後臺分離項目的時候用到了socket.io實現了在線聊天的功能、文本記錄一下項目中的注意點。前端

                          一、Node搭建的後臺部分vue

                                  第一節:socket.io鏈接服務端端口                                    node

                                  第二節: 定義服務端操做socket.io的方法,監聽前端用戶聊天和登陸express

                            二、vue.js前臺部分npm

2、主要知識                                                                      框架

一、Node搭建的後臺部分。socket

 第一節:socket.io鏈接服務端端口async

     (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

 

 

 

 

 

二、vue.js前臺部分

          (1)在index.html文件中引入而且使用

 

 

(2)用戶登陸時觸發

 

 

(3)私聊時觸發

相關文章
相關標籤/搜索