当前位置: 首页 > 后端技术 > Node.js

一个基于sockets实现长连接的express

时间:2023-04-03 15:40:52 Node.js

一个基于sockets实现长连接的express小逻辑:首先初始化并缓存routerUrl目录下的函数,通过Router.request调用缓存的函数。这个函数其实就是上面的register.set方法,主要是开始运行函数链,通过register.next运行下一个函数。函数流程main.js-->Router.request-->register.set-->register.next-->sock.writemain.js'usestrict';constrouterUrl='路由器';//当前目录下的路由器AddressconstRouter=require('./net/Router');//初始化路由constnet=require('net');constport='3000';Router.init(routerUrl);constapp=sock=>{sock.on('data',function(data){try{Router.request(data,sock);}catch(error){console.log(error)}});sock.on('error',(err)=>{console.log(err)})//为此套接字实例添加一个“关闭”事件处理程序sock.on('close',function(data){console.log('clone')})}constserver=net.createServer(app);server.listen(port,()=>{console.log(`Startuinenv${process.env.NODE_ENV||'development'}在端口${port}`);});server.on('error',(err)=>{console.log(err)})路由加载:Router.js文件constfs=require('fs');const_=require('lodash');varpath=require("path");varROOT_PATH=path.resolve(__dirname);classRouter{constructor(){this.routeMap={};}/***使用routerUrl匹配目录下的文件并加载到*@param{*}routerUrl*/init(routerUrl){letfiles=fs.readdirSync(path.join(ROOT_PATH,`../${路由器网址}`));return_.reduce(files,(config,file)=>{letsvc=require(path.join(ROOT_PATH,`../${routerUrl}/${file}`));this.routeMap={[file.split('.')[0]]:svc.get()};},{})}/***匹配url加载的路由器,其他字段可以自定义,这里的逻辑也可以改成配置文件,类似protobuf*@param{*}data{url,body}*@param{*}sock*/request(data,sock){try{this.routeMap[result.url.split('/')[1]][result.url.replace(`/${result.url.split('/')[1]}`,'')](数据,袜子);}赶上(错误){sock.write(错误);}}}module.exports=newRouter();中间件:register.js文件constNext=require('./next');类注册{构造函数(){this._init={};}set(url,...handlers){this._init[url]=async(data,sock)=>{try{letnext=new接下来(处理程序);next.run(数据,袜子);}赶上(错误){sock.write(错误);}};}run(data,sock){this.data=data;this.sock=袜子;this.stack[this.index](data,sock,this.next.bind(this));}next(){if(arguments[0]&&arguments[0]===+arguments[0]&&+arguments[0]{next()},async(data,sock)=>{尝试{sock.write(test);}catch(e){sock.write(e);}});总结:本项目只是用来休息express的idea。实际开发中使用,需要断开重连,优化连接,异常处理等功能