Node相关&&Koa与Express的区别


node有哪些相关的文件路径?

答案是:Node 中的文件路径有 __dirname,__filename, process.cwd(), ./ 或者 ../下面用一个例子来介绍这几种文件路径的区别

__dirname: 总是返回被执行的 js 所在文件夹的绝对路径
__filename: 总是返回被执行的 js 的绝对路径
process.cwd(): 总是返回运行 node 命令时所在的文件夹的绝对路径

node的http模块创建服务与Express或Koa框架有何不同?

答案是:express是一个服务端框架,框架简单封装了node的http模块,express支持node原生的写法,express不仅封装好服务器,还封装了中间件、路由等特征,方便开发web服务器,

换句话说express = http模块 + 中间件 + 路由

Express和Koa框架中间件有什么不同?

答案:中间件: app.use方法就是往中间件队列中塞入新的中间件,express中间件处理方式是线性的,next过后继续寻找下一个中间件,当然如果没有调用next()的话,就不会调用下一个函数了,调用就会被终止

express 中间件:是通过 next 的机制,即上一个中间件会通过 next 触发下一个中间件
koa2 中间件:是通过 async await 实现的,中间件执行顺序是“洋葱圈”模型(推荐)

洋葱模型其实就是中间件处理的流程,中间件生命周期大致有:

前期处理,交给并等待其它中间件处理,后期处理

洋葱模型
先回顾一下,Koa2.js 中下面代码打印输出顺序为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
const Koa = require('koa')
const app = new Koa()

app.use(async (cxt, next) => {
console.log('middleware_01 start')
await next()
console.log('middleware_01 end')
})

app.use(async (cxt, next) => {
console.log('middleware_02 start')
await next()
console.log('middleware_02 end')
})

app.use(async (cxt, next) => {
console.log('middleware_03 start')
console.log('middleware_03 end')
})

app.listen(3000)
1
2
3
4
5
6
7
8
// 浏览器访问:http://localhost:3000
// 输出顺序为:
middleware_01 start
middleware_02 start
middleware_03 start
middleware_03 end
middleware_02 end
middleware_01 end

掘金

Koa与Express的区别

Koa

  • 基于node的一个web开发框架,利用co作为底层运行框架,利用Generator的特性,实现“无回调”的异步处理;
  • ES7;
  • 更小、更富有表现力、更健壮的基石;
  • 利用async函数、Koa丢弃回调函数,增强错误处理;
  • 很小的体积,因为没有捆绑任何中间件;
  • 类似堆栈的方式组织和执行;
  • 低级中间件层中提供高级“语法糖”,提高了互操性、稳健性;

可以看到要从洋葱中心点穿过去,就必须先一层层向内穿入洋葱表皮进入中心点,然后再从中心点一层层向外穿出表皮,这里有个特点:进入时穿入了多少层表皮,出去时就必须穿出多少层表皮。先穿入表皮,后穿出表皮,符合我们所说的栈列表,先进后出的原则

Express

  • Node的基础框架,基础Connect中间件,自身封装了路由、视图处理等功能;
  • 线性逻辑,路由和中间件完美融合,清晰明了;
  • 弊端是callback回调方式,不可组合、异常不可捕获;
  • ES5;
  • connect的执行流程: connect的中间件模型是线性的,即一个一个往下执行;

区别

Handler的处理

Express普通回调函数,在同一线程上完成当前进程的所有Http请求;
Koa利用Generator Function作为响应器,co作为底层运行框架,利用Generator特性,实现“协程响应”;

路由

Express的路由是自身集成的;
Koa的需要引入中间件Koa-router;

启动方式

koa采用new Koa()
express采用传统的函数形式function;

回调

Koa没有回调
express有回调;

Http Request

koa1使用this取代Express的req、res;

Context

Koa新增了一个Context对象,用来代替Express的Request和Response,作为请求的上下文对象。
还有Node原生提供的req、res、socket等对象;

生命周期

Express的生命周期不确定:express内部执行异步函数,不能确定什么时候执行完;
Koa确定:koa是基于await/async,在执行下一步操作的时候,必须等待前端await执行完;

异步流程

Express采用callback来处理异步(ES5);
Koa1采用generator(ES6);
Koa2采用async/await(ES7);

错误处理

Express使用callback捕获异常,深层次的异常捕获不了;
Koa使用try catch,很好的解决异常捕获;

中间件
koa2的中间件

1、通过async await实现的,中间件执行的顺序是“洋葱圈”模型。
2、中间件之间通过next函数联系,当一个中间件调用next()后,会将控制权交给下一个中间件,直到下一个中间件不再执行next()后,会沿路返回,将控制权交给前一个中间件。

Express中间件

1、一个接一个顺序执行,response响应写在最后一个中间件中。
2、特点:
a.app.use用来注册中间件;
b.遇到http请求,根据path和method判断触发哪些中间件;
c.实现next机制,即上一个中间件会通过next触发下一个中间件;

参考链接

面试官问你关于node的那些事(基础篇)
前端面试—Koa与Express的区别


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!