vue+websocket+express+mongodb实战项目(实时聊天)(二)

2023-11-19

原项目地址:
【 vue+websocket+express+mongodb实战项目(实时聊天)(一)】
http://blog.csdn.net/blueblueskyhua/article/details/70807847

github地址: https://github.com/hua1995116/webchat
在线演示地址:http://www.qiufengh.com:8081/#/
在原项目(vue+websocket+express+mongodb实战项目(实时聊天)(一))的基础上,我又继续开发,增加了两个新功能,多个聊天室以及上传图片功能。觉得不错可以关注我,点波star。这个项目我会继续更新的。

###多个聊天室

首先我们先来看看socket.io的 API

加入某个分组

io.on('connection', function(socket){
  socket.join('some room');
});

向某个分组发送消息

io.to('some room').emit('some event');

而在我们这边也是一样的。

build/der-server.js

socket.on('login',function (obj) {
    socket.name = obj.name
    socket.room = obj.roomid
    if (!global.users[obj.roomid]) {
      global.users[obj.roomid] = {}
    }
    global.users[obj.roomid][obj.name] = obj
    socket.join(obj.roomid)
    io.to(obj.roomid).emit('login', global.users[obj.roomid])
    console.log(obj.name + '加入了' + obj.roomid)
  })

当一个用户加入一个房间时。让他加入一个分组。当然我们需要用户在加入的时候传递一个参数,房间名。

socket.on('message', function (obj) {
    //向所有客户端广播发布的消息
    var mess = {
      username: obj.username,
      src:obj.src,
      msg: obj.msg,
      img: obj.img,
      roomid: obj.room
    }
    io.to(mess.roomid).emit('message', mess)
    console.log(obj.username + '对房' + mess.roomid+'说:'+ mess.msg)
    if (obj.img === '') {
      var message = new Message(mess)
      message.save(function (err, mess) {
        if (err) {
          console.log(err)
        }
        console.log(mess)
      })
    }
  })

这样就可以向对应的房间发消息啦。
核心就是在加入的时候一定要传入房间名,否则就无法加入到某个分组中了。
###图片上传
1.客户端
利用了formdata

fileup() {
    var that = this
    var file1 = document.getElementById('inputFile').files[0]
    if (file1) {
        var formdata = new window.FormData()
        formdata.append('file', file1)
        formdata.append('username', that.getusername)
        formdata.append('src', that.getusersrc)
        formdata.append('roomid', that.getuserroom)
        // username: this.getusername,
        // src: this.getusersrc,
        this.$store.dispatch('uploadimg', formdata)
        var fr = new window.FileReader()
        fr.onload = function () {
            var obj = {
                username: that.getusername,
                src: that.getusersrc,
                img: fr.result,
                msg: '',
                room: that.getuserroom
            }
            console.log(obj)
            that.getsocket.emit('message', obj)
        }
        fr.readAsDataURL(file1)
    } else {
        console.log('必须有文件')
    }
}

2.服务器端
运用了multiparty模块。

app.post('/file/uploadimg', function (req, res, next) {
    // console.log(util.inspect(req.body, { showHidden: true, depth: null }))
    // console.log(util.inspect(req.header, { showHidden: true, depth: null }))
    // //生成multiparty对象,并配置上传目标路径
    var form = new multiparty.Form()
    // //设置编辑
    form.encoding = 'utf-8'
    // //设置文件存储路径
    form.uploadDir = "./static/files/"
    // //设置单文件大小限制
    form.maxFilesSize = 2 * 1024 * 1024
    // form.maxFields = 1000;  设置所以文件的大小总和
    // 上传完成后处理
    form.parse(req, function (err, fields, files) {
      console.log(fields)
      var filesTmp = JSON.stringify(files, null, 2)
      console.log(filesTmp)
      if (err) {
        console.log('parse error: ' + err)
        res.json({
          errno: 1
        })
      } else {
        var inputFile = files.file[0];
        var uploadedPath = inputFile.path
        var array = inputFile.originalFilename.split('.')
        var imgtype = array[array.length - 1]
        var dstPath = './static/files/' + new Date().getTime() + '.' + imgtype
        //重命名为真实文件名
        fs.rename(uploadedPath, dstPath, function (err) {
          if (err) {
            console.log('rename error: ' + err)
            res.json({
              errno: 1
            })
          } else {
            var mess = {
              username: fields.username,
              src: fields.src,
              img: dstPath,
              roomid: fields.roomid
            }
            var message = new Message(mess)
            message.save(function (err, mess) {
              if (err) {
                console.log(err)
              }
              console.log(mess)
            })
            console.log('rename ok')
            res.json({
              errno: 0
            })
          }
        })
      }
    })

  })

如果对于上传有问题可以看这个axios上传formdata失败以及nodejs接受formdata失败

效果图
这里写图片描述
这里写图片描述

关注

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

vue+websocket+express+mongodb实战项目(实时聊天)(二) 的相关文章

随机推荐

  • 多益网络校招 —— 二面hr面

    11月27号晚上技术面试 12月6号才收到hr面试通知 12月8号hr面 整轮hr面试只有15分钟 一开始是做自我介绍 然后问了以下问题 1 我父母对我的职业有什么看法 2 之前有没有拿到满意的offer 3 为什么学前端 4 未来职业规划
  • docker 安装wiki.js 和wekan

    wiki js https blog csdn net vegas lee article details 122356646 wekan http t zoukankan com caihemm p 14446937 html
  • 用python实现英文字母和相应序数转换

    用python实现英文字母和相应序数转换 第一步 字母转数字 英文字母转对应数字相对简单 可以在命令行输入一行需要转换的英文字母 然后对每一个字母在整个字母表中匹配 并返回相应的位数 然后累加这些位数即可 过程中 为了使结果更有可读性 输出
  • Linux USB摄像头使用

    Linux USB摄像头使用 一 使用V4l2工具调试摄像头 1 v4l2 ctl 常用操作 安装V4l2工具包 sudo apt install v4l utils 通过v4l2查看摄像头设备 sudo v4l2 ctl list dev
  • 在Java中产生随机数的两个方法

    一 利用random方法来生成随机数 在Java语言中生成随 机数相对来说比较简单 因为有一个现成的方法可以使用 在Math类中 Java语言提供了一个叫做random的方法 通过这个方法可以让系统产生随机 数 不过默认情况下 其产生的随机
  • C语言多级指针含义归纳

    前言 今天在实习二叉排序树的结点删除时 用到了三级指针 一下子有些困惑了 一番思考 才觉得对指针的理解更透彻了 条理地总结一下 从多个角度来分析 可以让思路更清晰 不同角度的含义单独来看不复杂 但是组合在一起就容易使我们陷入困惑 理解了各个
  • ctfshow_web175

    此文章是为了记录本人对知识理解 如有错误望敬请指出并谅解 打开场景可以看到在本题中 页面的拦截方式做了改变 检查结果是否有flag if preg match x00 x7f i json encode ret ret msg 查询成功 x
  • C语言写游戏——扫雷

    实现效果比较简陋 如图 写游戏需要不同的文件构成 首先看一下资源管理器清楚框架结构 在test c文件里编写整个游戏的运行逻辑 具体代码 define CRT SECURE NO WARNINGS 1 include game h 测试游戏
  • 数据决定AIGC的高度,什么又决定着数据的深度?

    有人曾言 数据决定人工智能发展的天花板 深以为然 随着ChatGPT等AIGC应用所展现出的强大能力 人们意识到通用人工智能的奇点正在来临 越来越多的企业开始涌入这条赛道 在AIGC浪潮席卷全球之际 数据的重要性也愈发被业界所认同 之所以会
  • Linux-挖矿木马清理

    一 什么是挖矿木马 挖矿木马会占用CPU进行超频运算 从而占用主机大量的CPU资源 严重影响服务器上的其他应用的正常运行 黑客为了得到更多的算力资源 一般都会对全网进行无差别扫描 同时利用SSH爆破和漏洞利用等手段攻击主机 部分挖矿木马还具
  • ConstraintLayout系列:ConstraintLayout实现左右均分布局

    效果图 关键代码 android layout width 0dp 0dp在ConstraintLayout中的含义是match constraint 完整代码
  • CTex的基本用法

    主要内容 Latex简介 命令和环境 文档排版和组织 普通文本编辑 数学公式编辑 图形 插图 表格 文献等的编辑 一 Latex简介 1 概述 首先要从TEX介绍起 TEX是斯坦福大学的教授Donald E Knuth 图灵奖获得者 开发的
  • django.db.utils.DataError: (1406, “Data too long for column ‘name‘ at row 1“)

    报错现象 django db utils DataError 1406 Data too long for column name at row 1 排除故障 当时第一反应是上网百度 结果搜出来的结果都是改字符集 但明显我这个和字符集关系不
  • 单片机语音识别原理

    语音识别是一门交叉学科 近二十年来 语音识别技术取得显著进步 开始从实验室走向市场 人们预计 未来10年内 语音识别技术将进入工业 家电 通信 汽车电子 医疗 家庭服务 消费电子产品等各个领域 语音识别听写机在一些领域的应用被美国新闻界评为
  • 基于SSM框架的多文件上传Controller类编写

    前端代码
  • Spring Boot 从Json静态文件中读取数据

    Spring Boot 从Json静态文件中读取数据 在实体中 通常使用类似字典表的文件来表示属性 文件大都配置在配置文件中 也可以是静态文件 本次记录如何从静态json文件中读取所需字段 1 文件格式以及路径 2 加载文件 import
  • QT进程间通信 详细介绍

    在QT中 信号和槽的机制取代了这种繁杂的 易崩溃的对象通信机制 信号是当对象状态改变时所发出的 槽是用来接收发射的信号并响应相应事件的类的成员函数 信号和槽的连接是通过connect 函数来实现的 AD 1 QT通信机制 为了更好的实现QT
  • MVC三层架构

    1 什么是MVC Model View Controller 模型 视图 控制器 模型就是Java对应数据库的那些字段 实体类 视图 就是JSP页面 控制器 就是Servlet负责跳转页面 Controller作用 Controller其实
  • Android addview—动态添加view

    一 前言 在日常的开发中经常遇到需要动态添加子view的情况 addview是ViewGroup的特有方法 可以在布局中动态添加view 而view是不存在这个方法的 二 使用方式 1 方法介绍 addview有以下几种方式 addView
  • vue+websocket+express+mongodb实战项目(实时聊天)(二)

    原项目地址 vue websocket express mongodb实战项目 实时聊天 一 http blog csdn net blueblueskyhua article details 70807847 github地址 https