技术栈
觉得好的欢迎点个 star ^_^。
演示
目录
├─bin │ www // 后端 服务器 │ database // 后端 数据库 │ socket // 后端 socket | router // 后端 路由 ├─sessions // 后端 session ├─public │ src // 前端 开发目录 │ dist // 前端 线上目录 ├─routes // 前端 路由 ├─view // 前端 页面 ├─app.js // 前端 服务器 ├─gulpfile.js // 前端 Gulp ├─package.json
安装
Windows 安装教程 | Linux 安装教程
git clone https://github.com/bergwhite/nodejs-chat // 克隆项目 cd nodejs-chat // 进入目录 npm install // 安装依赖 npm run build // 构建 线上代码 npm run mongod // 开启 数据库 npm run start // 开启 聊天室
功能
聊天
用户
房间
优化
基础
展示
开发
安全
< >
等特殊标签认证
部署
踩坑
图灵机器人不支持跨域,通过代理中间件把请求代理到本地。
var proxy = require('http-proxy-middleware'); app.use('/api/robot', proxy({ target: 'http://www.tuling123.com', changeOrigin: true }));
Gulp 使用通配符对多个文件处理,会压缩到一个文件中。以下是分别进行压缩的方式。
const gulp = require('gulp'), minifyJS = require('gulp-uglifyjs'), babel = require('gulp-babel'), rename = require('gulp-rename'); const compileDir = { css: { src: 'public/src/css/index.less', dest: 'public/dist/css' }, js: { src: 'public/src/js/', dest: 'public/dist/js' } }; gulp.task('compile-js', () => { const JSTaskList = ['index', 'login', 'mobile', 'room', 'roomAdd', 'userInfoMod', 'roomMember'] return JSTaskList.map((e) => { gulp.src(`${compileDir.js.src}${e}.js`) .pipe(babel({ presets: ['es2015'] })) .pipe(minifyJS()) .pipe(rename((path) => { path.basename += '.min' })) .pipe(gulp.dest(compileDir.js.dest)) }) });
gulp-uglifyjs - No files given; aborting minification
之前删除了一个 JS 文件,但是没有删除 JSTaskList 中的对应值。编译时会报上面的错误。删除对应的值就编译成功了。
![]() | 1 bw2 OP 文章是十分钟自动放弃编辑权限? ------------------------------------------------ 补充 ------------------------------------------------ 项目源码: https://github.com/bergwhite/nchat 在线演示: http://47.93.252.247:8086/ |
2 agostop 2017-07-25 08:41:58 +08:00 现在一说全栈,就说的 nodejs ? |
3 aksoft 2017-07-25 08:49:12 +08:00 ![]() 不是从 销售 设计 前端 后端 DBA 服务器 叫全栈吗? |
![]() | 8 DKYzz 2017-07-25 09:14:38 +08:00 感觉对话字体很小,是我的错觉吗 |
![]() | 12 seasstyle 2017-07-25 09:29:50 +08:00 via Android ![]() 怎么手机上找不到 github 的 star ? |
13 JasperYanky 2017-07-25 09:31:38 +08:00 全栈不是 前端+后端+客户端么 |
![]() | 15 bw2 OP @JasperYanky 客户端还在筹备中,预计用 RN 开发 |
![]() | 17 O3YwA1ENkb7i35XJ 2017-07-25 10:55:46 +08:00 ![]() ![]() |
![]() | 20 O3YwA1ENkb7i35XJ 2017-07-25 11:18:33 +08:00 ![]() 因为我并不是改的图片, 而是修改的用户名. bin/socket/event.js 第 90 行, 在接收消息的时候, 允许从消息中得到当前的 `user`. 然后在接收之后, 广播给其他人的时候, 其他人接收时的处理逻辑是这样的, public/src/js/index.js 第 102 行, 把接收到的 `user` 传递给 renderBubbleMsg 方法, 这个方法 在使用 `user` 时直接拼入字符串内(未做转义处理, 第 156 行), 所以只要 emit 那个事件, 并将 user 设置为 <img src="" Onerror="alert(/Hello from v2ex/)">admin , 然后其他收到消息的人, 就会弹出提示框了. |
![]() | 22 O3YwA1ENkb7i35XJ 2017-07-25 12:57:47 +08:00 ![]() |
23 hantsy 2017-07-25 13:01:34 +08:00 ![]() 只能说用 Firebase 这种太容易实现了。 |
26 hantsy 2017-07-25 22:46:50 +08:00 @bw2 Firebase 官方有 AngularJS 和 Angular 2 支持。之前一个项目用的 AngularJS 1.5 + Firebase 实现了一个聊天功能(包括文字,图片聊天,消息提醒(在聊天窗口不提醒,离开聊天窗口有通知 Icon, 离线会发送邮件),离线 /在线标记),Firebase 的 AngularJS 本身全部基于 Websocket (当然源于底层的 Firebase SDK ), 所以实时支持是默认的。Firebase 官方也有个比较复杂的聊天程序例子。 比较无奈的 Firebase 是纯 Key/value 的 NoSQL, 数据结构太简单,想做复杂查询就麻烦了。 |