nodejs中间件高雅和表达有什区别

  介绍

这篇文章将为大家详细讲解有关nodejs中间件高雅和表达有什区别,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

高雅用起来非常方便,比之表达,它“完美中间件”的设计让功能之间看起来非常简洁!笔者在项目中就曾这样使用过:

const 高雅=要求(& # 39;洋槐# 39;)   const 应用=new 高雅()   const 路由器=要求(& # 39;koa-router& # 39;)   const 路由器=new 路由器()   const 歌珥=要求(& # 39;koa2-cors& # 39;)   const  koaBody=要求(& # 39;koa-body& # 39;)      const  ENV=& # 39; test-mpin2& # 39;      app.use(歌珥({   产地:[& # 39;http://localhost: 9528 & # 39;),,,,//,也可以写为:[& # 39;* & # 39;]   凭证:真   }))   app.use (koaBody ({   多部分:真   }))   接下来app.use(异步(ctx)=祝辞{   console.log(& # 39;访问全局中间件& # 39;)   ctx.state.env=ENV ,,//,全局缓存   await  next ()   })      const 播放列表=要求(& # 39;。/控制器/playlist.js& # 39;)   router.use(& # 39;/播放列表# 39;,playlist.routes ())   const 博客=要求(& # 39;。/控制器/blog.js& # 39;)   router.use(& # 39;/博客# 39;,blog.routes ())      app.use (router.routes ()) .use (router.allowedMethods ())      app.listen(3000年,()=祝辞{   console.log(& # 39;服务已开启& # 39;)   })

它将路由路由器抽离出去作为单独的中间件使用,则应用程序只负责全局处理。还比如:

//,最外层中间件,可以用于兜底,Koa 全局错误   app.use (async  (ctx,,下一个),=祝辞,{   try {才能   ,,,//,执行下一个中间件   ,,,await  next ();   ,,},catch (错误),{   ,,,console.log (“(koa 错误):$ {error.message} ')   ,,}   });//,第二层中间件,可以用于日志记录   app.use (async  (ctx,,下一个),=祝辞,{   {const 才能;req },=, ctx;   console.log才能(“req  is  $ {JSON.stringify(点播)}”);   await 才能;next ();   console.log才能(“res  is  $ {JSON.stringify (ctx.res)}”);   });

<强>简单实现一个高雅吧!

如上代码,我们看高雅实例,通过使用方法注册和串联中间件,其源码的简单实现可以表述为:

使用(fn), {   ,,,this.middleware.push (fn);   ,,,return ;   }

我们将中间件存储到<代码>。中间件> //,通过,createServer 方法启动一个,Node.js 服务   听(…args), {   ,,,const  server =, http.createServer (this.callback ());   ,,,server.listen (…args);   }

高雅框架通过http模块的<代码> createServer 方法创建一个节点。js服务,并传入<代码> this.callback() 方法,调源码简单实现如下:

回调(){   const  fn=组成(this.middlewareList)      return (点播,res)=祝辞{   res const  ctx=createContext(点播)   fn return  this.handleRequest (ctx)   }   }      handleRequest (ctx, fn), {   ,,,const  onerror =, err =祝辞,ctx.onerror(错);   ,,,//,将,ctx 对象传递给中间件函数,fn   ,,,return  fn (ctx) .catch (onerror);   }

如上代码,我们将高雅一个中间件组合和执行流程梳理为以下步骤:

<李>

通过一个方法(我们称为组成)组合各种中间件,返回一个中间件组合函数<代码> fn

<李>

请求过来时,会先调用<代码> handleRequest 方法,该方法完成:

<李>

调用<代码> createContext 方法,对该次请求封装出一个ctx对象,

<李>

接着调用<代码>。fn handleRequest (ctx) 处理该次请求。

其中,核心过程就是使用合成方法组合各种中间件——这是一个单独的方法,它应该不受高雅其余方法的约束。其源码简单实现为:

//,组合中间件//,和表达中接下来的函数意义一样   function 组成(middlewareList) {//,return 功能意思是返回一个函数   接下来return 函数(ctx) {//,各种中间件调用的逻辑   function 调度(i) {   const  fn=middlewareList[我],| |,下一个   如果(fn) {   尝试{//,高雅中都是异步的,其返回的是一个承诺(对象)   return  Promise.resolve (fn (ctx function  next () {   return 调度(i + 1)   }))   }捕捉(err) {   return  Promise.reject (err)   }   其他}{   return  Promise.resolve ()   }   }   return 调度(0)   }   }

nodejs中间件高雅和表达有什区别