egg框架(通过egg-socket.io建立即时通讯服务,实现聊天功能)

不好意思,现在懒得写感想了,直接入正题吧。

1.此处默认你已经创建了一个egg项目,先安装egg-socket.io

npm i egg-socket.io --save

2.在config文件夹中的plugin.js中使该插件生效

'use strict';

/** @type Egg.EggPlugin */
module.exports = {
  // had enabled by egg
  // static: {
  //   enable: true,
  // }
  io: {
    enable: true,
    package: 'egg-socket.io',
  }
};

3.在config文件夹中config.default.js中队该插件进行配置
connectionMiddleware:顾名思义,在连接或者断开连接时起作用的中间件。你
packetMiddleware:作用于每一个数据包,加密或者解密,转码等等都可以在这里进行
前面’/‘和’/example’都是路径,在路由中调用,用于在不同场景下建立不同的socket连接,就比如一对一聊天和一对多聊天,你可以调用不同的中间件进行处理,也可以调用不同的控制器,对接收到的数据进行不同的处理。

  exports.io = {
    init: { },
    namespace: {
      '/': {
        connectionMiddleware: ['connection'],
        packetMiddleware: ['packet'],
      },
      '/example': {
        connectionMiddleware: [],
        packetMiddleware: [],
      },
    },
  };

4.在app文件夹下创建io文件夹,在io文件夹下创建controller跟middleware两个文件夹
一个放io的控制器,一个放io中间件

这个io中的middleware跟app中的middle不太一样

app/middleware:框架中间件
app/io/middleware:插件中间件

然后io文件夹中的middleware文件夹中创建两个js文件,一个connection,js,一个packet.js,这个名字可以随便起,跟在配置文件中引入的一样就行了。

connection.js:

module.exports = app => {
    return async (ctx, next) => {
      ctx.socket.emit('res', 'connected!');
      await next();
      // execute when disconnect.
      console.log('disconnection!');
    };
};

packet.js:

module.exports = app => {
    return function* (next) {
        this.socket.emit('res', 'packet received!');
        console.log('packet:', this.packet);
        yield* next;
    };
};

5.在io文件夹中的controller文件夹中创建控制器defalut.js,这个名字也随便,在路由里调用对应的控制器就完事了。

const Controller = require('egg').Controller;

class DefaultController extends Controller {
  async index() {
    const { ctx, app } = this;
    const message = ctx.args[0];
    console.log(message)
    await ctx.socket.emit('res', {name:'robot',msg:message.msg});
  }
}

module.exports = DefaultController;

ctx.args里放的就是客户端传回来的东西,我这里传过来的ctx.args[0]里面是一个对象:

{
	name:'U.amazing',
	msg: "31231651"// 前端输入的消息,这里我随便输的
}

然后服务器端返回了一个对象:

{
	name:'robot',
	msg:message.msg
}

6.在router.js中配置路径

'use strict';

/**
 * @param {Egg.Application} app - egg application
 */
module.exports = app => {
  const { router, controller, io } = app;
  router.get('/', controller.home.index);
  // socket.io
  io.of('/').route('server', io.controller.default.index);
};

7.感觉有点长了,关于Vue如何配置socketio我还是另起一片文章写好了。

你可能感兴趣的:(egg框架(通过egg-socket.io建立即时通讯服务,实现聊天功能))