nodejs router 返回html_Vue+Nodejs+WebSocket实现多人聊天室

f01fe53f6b60e7bdc9cc675e90236d4d.png

点击上方蓝字关注我们

4c41469c385e5809d4febdca309dff9f.png

上篇文章已经给大家介绍了使用原生JavaScript+Nodejs+WebSocket实现多人聊天室的内容。

这期的话,我们使用Vue2.x版本同样使用Nodejs+WebSocket继续实现多人聊天室功能。

因为上期已经介绍了关于WebSocket的一些特点和重要的事件处理函数,这期就不详细介绍了。只是用Vue2.x的版本再做一遍,感受一下区别。

首先我们应该使用VueCli新建一个Vue2.x版本的项目。然后整理一下文件目录,删除无用的内容。

d21b8f083c0cfba6b71e69110d462a45.png

我们只用到两个视图,分别是Home和Login。main.js的内容不动。router文件夹的index.js稍微改一下路由:

65633bff412e3bb3b56dd835ceafefb1.png

router/index.js

2a5a8f0dfb300d4e713c0e7862ebbee1.png
import Vue from 'vue'import VueRouter from 'vue-router'import Login from '../views/Login.vue'Vue.use(VueRouter)const routes = [  {    path: '/Login',    name: 'Login',    component: Login  },  {    path: '/',    name: 'Home',    // route level code-splitting    // this generates a separate chunk (about.[hash].js) for this route    // which is lazy-loaded when the route is visited.    component: () => import(/* webpackChunkName: "Home" */ '../views/Home.vue')  }]const router = new VueRouter({  mode: 'history',  base: process.env.BASE_URL,  routes})export default router

    然后我们看一下视图中的Login.vue。

65633bff412e3bb3b56dd835ceafefb1.png

views/Login.vue

2a5a8f0dfb300d4e713c0e7862ebbee1.png
<template>  <div class="about">    Login    <input type="text" placeholder="请输入用户名"  v-model="username"/>    <button @click='handleEnterBtnClick'>进入聊天室button>  div>template><script>export default {  name:'Login',  data () {    return {      username:''    }  },  mounted () {    const username = localStorage.getItem('username');    if(username){      this.$router.push('/');      return;    }  },  methods: {    handleEnterBtnClick(){      const username = this.username.trim();      console.log(username);      if(username.length < 6){        alert('用户名不能小于六位');        return;      }      localStorage.setItem('username',username);      this.$router.push('/');    }  }}script>

这和之前的原生JavaScript版本的entry.html的作用一样。

使用vue比原生JavaScript最明显的区别就是不用操作dom了,减少了很多的操作。

Home.vue是聊天室的内容。

65633bff412e3bb3b56dd835ceafefb1.png

views/Home.vue

2a5a8f0dfb300d4e713c0e7862ebbee1.png
<template>  <div class="home">    <ul>      <li v-for="item in msgList" :key="item.id">        <p>          <span>{{ item.user }}span>          <span>{{ new Date(item.dateTime) }}span>        p>        <p>消息:{{item.msg}}p>      li>    ul>    <input type="text" placeholder="请输入消息"  v-model="msg"/>    <button @click="handleSendBtnClick">发送button>  div>template><script>const ws = new WebSocket('ws://localhost:8000');export default {  name: 'Home',  data () {    return {      msg:'',      username:'',      msgList:[]    }  },  mounted () {    this.username = localStorage.getItem('username');    if(!this.username){      this.$router.push('/login');      return;    }    ws.addEventListener('open',this.handleWsOpen.bind(this),false);    ws.addEventListener('close',this.handleWsClose.bind(this),false);    ws.addEventListener('error',this.handleWsError.bind(this),false);    ws.addEventListener('message',this.handleWsMessage.bind(this),false);  },  methods: {    handleSendBtnClick(){      const msg = this.msg;      if(!msg.trim().length){        return;      }      ws.send(JSON.stringify({        id: new Date().getTime(),        user:this.username,        dateTime:new Date().getTime(),        msg:this.msg      }))      this.msg = '';      },    handleWsOpen(e){      console.log('FE:WebSocket open',e);    },    handleWsClose(e){      console.log('FE:WebSocket close',e);    },    handleWsError(e){      console.log('FE:WebSocket error',e);    },    handleWsMessage(e){      // console.log(e);      // console.log('FE:WebSocket message',e.data);      const msg = JSON.parse(e.data);      console.log(msg);      this.msgList.push(msg);    }  }}script>

和之前的原生JavaScript版本没有太大的区别,最大的感受就是不用再操作dom了。

后端的话,我们就直接在根目录新建一个server文件夹,下载ws模块。

npm i ws -s

index.js内容:

65633bff412e3bb3b56dd835ceafefb1.png

server/index.js

2a5a8f0dfb300d4e713c0e7862ebbee1.png
const ws = require('ws');const server = new ws.Server({    port:8000})server.on('open',handleOpen);server.on('close',handleClose);server.on('error',handleError);server.on('connection',handleConnection);function handleOpen(){    console.log('BE:WebSocket open');}function handleClose(){    console.log('BE:WebSocket close');}function handleError(){    console.log('BE:WebSocket error');}function handleConnection(e){    console.log('BE:WebSocket connection');    e.on('message',handleMessage);}function handleMessage(msg){    console.log(msg);    console.log(server.clients);    server.clients.forEach((c)=> {        c.send(msg);    })}

因为大部分的事件处理函数都和原生的JavaScript版本一模一样,所以就不做过多的解释了。大家可以直接复制代码体验。

项目运行的结果和原生JavaScript一样。

d878d3b0f48d02bbf872743a7707e7ac.gif

完整的源代码文件关注我的公众号:Code程序人生,回复关键字聊天室。

4e3e1837cc0163ce1ed2c92ae5ad69be.gif

有帮助的同学可以点赞关注转发一下,谢谢!年底有抽奖活动。

fbfde7d8cef28859a253d5bc8f2dd68d.png

往期推荐

原生JavaScript+WebSocket+nodejs实现聊天室功能

前端面试题之---Object.defineProperty(1)

在vue.config.js中模拟后端接口数据

Vue知识点总结(24)——使用VueCli创建一个项目(超级详细)

普本在校生是如何零基础在一个月内开发出第一款微信小程序的

b567b094-b265-eb11-8da9-e4434bdf6706.svg

点个在看你最好看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值