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

存在?用Node.js实现一个http服务器框架?

时间:2023-04-03 19:29:54 Node.js

功能演化:V1:基础http服务器支持中间件,支持异步中间件V1.x:JS切换为TSrequest/response装饰增强细化统一异常处理细化流程控制V2:AOP自定义注解拦截IOC管理注入@Controller/@服务组件@请求标签handler@ResponseBody自动处理返回值事务V2.x:缓存框架权限认证(AOP,策略模式,装饰模式)V1:SOS.jsconsthttp=require('http');consturl=require('url');constEventEmitter=require('事件');constcompose=(ctx)=>(...funcs)=>{if(funcs.length===0){returnarg=>arg}letlastIndex=funcs.length-1;returnfuncs.reduceRight((a,b,index)=>b(()=>{if(index===funcs.length-1){returnPromise.resolve();}if(lastIndex!==index){returnPromise.reject(newError('不能调用next()overonce!'))}lastIndex--;try{returnPromise.resolve(a(ctx));}catch(e){returnPromise.reject(e);}}),1);};constapplyMiddleware=(middles,ctx)=>compose(ctx)(...middles);SOS类扩展EventEmitter{constructor(){this.middleWares=[];this.serve=http.createServer(async(req,res)=>{constctx={req,res};consthandler=applyMiddleware(this.middleWares,ctx);awaithandler(ctx);res.finisn||res。结尾();});}use(mid){this.middleWares.push(mid);}listen(...agr){this.serve.listen(...agr);console.log('开始');}onerror(err,ctx){if(err.code==='ENOENT'){ctx.status=404;}else{ctx.status=500;}让msg=err.message||'000错误';ctx.res.end(msg);this.emit('错误',错误);}}test.jsconstsos=newSOS();sos.listen(9009);sos.use((next)=>async(ctx)=>{console.log('\npathname::',url.parse(ctx.req.url).pathname);ctx.res.write(newDate()+'');console.log('before111');ctx.res.write('before111\n');等待下一个吨();console.log('111之后');ctx.res.write('111\n'之后);});sos.use((next)=>async(ctx)=>{console.log('222之前');ctx.res.write('before222\n');awaitnext();console.log('after222');ctx.res.write('endtest222\n');returnnewPromise((resolve,reject)=>{setTimeout(()=>{console.log('timeout222');ctx.res.write('timeout222\n');returnresolve();},3000);});});sos.use((next)=>async(ctx)=>{console.log('333之前');ctx.res.write('333之前\n');awaitnext();console.log('333之后');ctx.res.write('结束test333\n');});