介绍
这篇文章将为大家详细讲解有关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中间件高雅和表达有什区别