Node.js Web开发(一)

C/S架构是早期的软件架构,其特征是客户端运行在PC上,数据库运行在服务器上。但是随着互联网点兴起,人们发现C/S架构并不适合Web应用,因为Web应用的更新速度很快,迭代周期很短,而CS架构要求每次迭代都更新客户端,这太麻烦了,于是就有了B/S架构。

Web开发经历的阶段:

  • 静态Web页面
  • CGI(Common Gateway Interface,用C/C++编写的)
  • ASP/JSP/PHP(脚本语言相比C/C++开发效率高)
  • MVC(解决了直接用脚本嵌入HTML导致的可维护性差的问题)
  • 异步开发、MVVM…

Node.js的优势:

  • 前端开发者也可以写后端
  • 不用切换语言了
  • 速度快,非常快!

目前,在npm上已发布的开源Node.js模块数量超过了47.5万个了!有着数不清的Web框架、ORM框架、模版引擎、测试框架、自动化构建工具。


Web框架 - koa

一开始看到koa有点莫名其妙,但是,其实它就是大名鼎鼎的express框架的下一代框架,为什么express这么成功了,还要有下一代呢?因为express是基于ES5标准的,它要实现异步操作就只有一种方法,就是回调(callback),这种方法在一两个嵌套的时候显得还比较得体,但是多了之后,代码就会很难看了。

koa 1.0

Express团队基于ES6使用了generator编写了koa,但是generator本意不是用来写异步的,Promise才是,但是用Promise来写的话会十分复杂,所以ES7就要诞生了…会有async关键字来完成异步,这样就有了koa 2.0

koa 2.0

koa2完全使用了Promise并且配合async关键字来实现异步。

koa2入门 - 理解middleware

由于koa2是基于ES7,所以Node.js官网的v6.11.3 LTS版本并不支持,只有大于7的Node.js才支持koa2,所以需要下载最新的v8.5.0版本才可以正确使用koa2,否则会因为版本过低而报错。

先来看一个最简单的app.js:

1
2
3
4
5
6
7
8
9
10
11
const Koa = require('koa');
const app = new Koa();
app.use(async (ctx, next)=>{
await next();
ctx.response.type = 'text/html';
ctx.response.body = '<h1>Hello, koa2!</h1>';
});
app.listen(3000);
console.log('app started at port 3000...');

这里有几个与以往不同的关键词值得关注:

  • ctx: 这个其实是context(上下文)的简写,用来存放request和response对象的
  • next: 这是koa传入的将要处理的下一个异步函数,这个是由koa控制的
  • await: ES7的关键字,这里await next()表示先处理下一个异步函数,然后再干点别的
  • async: 也是ES7的关键字,

async是用来将函数标记为异步函数的,而await是用来调用一个异步函数的。

Q: await next()的作用是?
A: koa把很多async函数组成一个任务链,每个async函数都可以做一些自己的事情,然后用await next()来调用下一个async函数。我们把每个async函数成为middleware,通过middleware的组合,我们可以完成很多有用的功能。

PS: middleware的顺序十分重要,调用app.use()的顺序决定了middleware的顺序。

Q: app.use()的用法是?
A: app.use()加载用于处理http请求的中间件(middleware),当一个请求来的时候,会依次被这些middlewares处理,而处理的顺序就是定义的顺序。官方的文档中有一句话是这样说的:

Since path defaults to “/”, middleware mounted without a path will be executed for every request to the app.
由于路径默认为“/”,没有加载路径的中间件会在app每次被请求的时候执行。

据说理解了middleware,我们就会用koa了!(really?)

ctx还有一些简写的方法:

  • ctx.url = ctx.request.url
  • ctx.type = ctx.response.type