Skip to content
On this page

koa应用初见

打开 generator-k 生成的app.js 。

代码有些多,不利于作为上手学习,我们创建个 book/demo.js,内容如下:

javascript
var koa = require('koa');
    var app = koa();
    
    app.use(function *(){
        var path = this.path;
        this.body = path;
    });
    
    app.listen(3000);

运行命令:

shell
node --harmony demo.js

访问 http://localhost:3000,页面会打印出当前 url 的路径 “/”,使用 http://localhost:3000/demo 访问试试,输出的是/demo。

我们来看下代码含义。

初始化 koa :

javascript
var koa = require('koa');
    var app = koa();

使用 app.use() 注入中间件,这是与 express 最大不同的地方。

所有的koa中间件,必须是 generator function ,即 function *(){} 语法,不然会报错。

中间件 的上下文 this,指向用户当前的请求,中间件只有在请求时才会触发逻辑,比如获取当前请求的路径,可以使用:

javascript
app.use(function *(){
        var path = this.path;
    });

建议在中间件中打个断点,看一下 this 的信息,非常丰富,后面会展开论述。

this.body 用于控制输出到页面的内容,比如:

javascript
app.use(function *(){
        this.body = '<p>我是个html片段</p>';
    });

可以注入多个中间件,koa 会从上到下执行,然后从下到上执行,关于中间件的执行顺序问题,后面会展开论述。

javascript
app.use(function *(){
        this.demo = 'test text';
    });
    
    app.use(function *(){
        this.body = this.demo;
    });

app.use() 究竟发生了什么不可思议的化学反应呢?

其实 app.use() 就干了一件事,就是将中间件放入一个数组,真正执行逻辑的是:

javascript
app.listen(3000);

koa 的 listen() 除了指定了 http 服务的端口号外,还会启动 http server,等价于:

javascript
var http = require('http');
    http.createServer(app.callback()).listen(3000);

后面这种繁琐的形式有什么用呢?

一个典型的场景是启动 https 服务,默认 app.listen(); 是启动 http 服务,启动 https 服务就需要:

javascript
var https = require('https');
    https.createServer(app.callback()).listen(3000);

关于 https 服务后面章节会展开论述,这里先跳过。