不好意思,现在懒得写感想了,直接入正题吧。
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我还是另起一片文章写好了。