原项目地址: 
【 vue+websocket+express+mongodb实战项目(实时聊天)(一)】 
http://www.cnblogs.com/qiufenghua/p/6772949.html

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失败

效果图

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

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

    继上一个项目用vuejs仿网易云音乐(实现听歌以及搜索功能)后,发现上一个项目单纯用vue的model管理十分混乱,然后我去看了看vuex,打算做一个项目练练手,又不想做一个重复的项目,这次我就放弃颜 ...

  2. express + mongodb 搭建一个简易网站(二)

    express + mongodb 搭建一个简易网站 (二) 在搭建网站(一)中,实现了简单的路由功能,这离一个完整的网站还差的有点远,继续撸代码吧. 1.首先在根目录下新建一个views文件夹,用来 ...

  3. MongoDB实战读书笔记(二):面向文档的数据

    1 schema设计原则 1.1 关系型数据库的三大设计范式 第一范式(1NF)无重复的列 第二范式(2NF)属性完全依赖于主键 [ 消除部分子函数依赖 ] 第三范式(3NF)属性不依赖于其它非主属性 ...

  4. Django REST framework+Vue 打造生鲜电商项目(笔记二)

    (转自https://www.cnblogs.com/derek1184405959/p/8768059.html)(有修改) 接下来开始引入django resfulframework,体现它的强大 ...

  5. vue+nodejs+express解决跨域问题

    nodejs+express解决跨域问题,发现网上的大部分都是误导人,花了不少时间,终于弄懂了, 我在vue+nodejs+express+mongodb的项目里面,发现本地用vue代理正常调用远程的 ...

  6. 15-Flink实战项目之实时热销排行

    戳更多文章: 1-Flink入门 2-本地环境搭建&构建第一个Flink应用 3-DataSet API 4-DataSteam API 5-集群部署 6-分布式缓存 7-重启策略 8-Fli ...

  7. SpringBoot+Vue+WebSocket 实现在线聊天

    一.前言 本文将基于 SpringBoot + Vue + WebSocket 实现一个简单的在线聊天功能 页面如下: 在线体验地址:http://www.zhengqingya.com:8101 二 ...

  8. Node+Express+MongoDB + Socket.io搭建实时聊天应用实战教程(二)--node解析与环境搭建

    前言 本来开始写博客的时候只是想写一下关于MongoDB的使用总结的,后来觉得还不如干脆写一个node项目实战教程实战.写教程一方面在自己写的过程中需要考虑更多的东西,另一方面希望能对node入门者有 ...

  9. Node+Express+MongoDB+Socket.io搭建实时聊天应用实战教程(一)--MongoDB入门

    前言 本文并不是网上流传的多少天学会MongoDB那种全面的教程,而意在总结这几天使用MongoDB的心得,给出一个完整的Node+Express+MongoDB+Socket.io搭建实时聊天应用实 ...

随机推荐

  1. JSON 解析工具的封装(Java)

    JSON 解析工具的封装(Java) 一直想有一个属于自己的JSON工具,今天终于弄好了..... 1.添加pom依赖包 <!--json解析--> <dependency> ...

  2. NodeJS 事件循环

    Node.js 是单进程单线程应用程序,但是通过事件和回调支持并发,所以性能非常高. Node.js 的每一个 API 都是异步的,并作为一个独立线程运行,使用异步函数调用,并处理并发. Node.j ...

  3. 使用虚拟机CentOS7部署CEPH集群

    第1章   CEPH部署 1.1  简单介绍 Ceph的部署模式下主要包含以下几个类型的节点 Ø CephOSDs: A Ceph OSD 进程主要用来存储数据,处理数据的replication,恢复 ...

  4. MySQL修改表字段相关信息

    昨天收获颇多,首先回顾一下有关mysql的内容. 我在查询表信息时,出现了 empty set 0.00 sec 的错误,我很奇怪,仔细检查发现原来是表字段名称写错了, 于是我想修改字段名称,经过查询 ...

  5. 在Debian 8 上安装自动化工具Ansible

    如果你是新手,就不要犹豫了,ansible是你最好的选择,本人菜鸟一个.废话少说,开始安装! 实验环境: 192.168.3.190 192.168.3.191 192.168.3.192 192.1 ...

  6. 关于WebService、WebApi的跨域问题

    随着移动互联网的发展, 传统营销模式往网站以及移动客户端转移已经成为一种趋势.接触过互联网开发的开发者肯定会很熟悉两种网络服务WebApi.WebService.在使用JavaScript进行数据交互 ...

  7. sublime Text 3常用Html/Css基础插件安装

    前言 sublime以其简洁明了的外观,干脆利落的编辑方式,再加上丰富的功能插件,深受广大开发者的喜爱.今天,我就来介绍几款基于Html/Css开发的sublime插件. 1.Package Cont ...

  8. IOS的UIPickerView 和UIDatePicker

    1.UIPickerView的常见属性 //数据源(用来告诉UIPickerView有多少列多少行) @property(nonatomic,assign) id<UIPikerViewData ...

  9. Java学习笔记——设计模式之二.策略模式

    明确是王道 --Clean Code 先定义策略类 package cn.no2.strategy; public abstract class Strategy { //省略属性 //算法方法 pu ...

  10. JSP页面的静态包含和动态包含

    JSP中有两种包含:静态包含:<%@include file="被包含页面"%>和动态包含:<jsp:include page="被包含页面" ...