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)私聊时触发

相关文章
相关标签/搜索