koa
基本使用
var Koa = require('koa');
var Router = require('koa-router');
var app = new Koa();
var router = new Router();
/*
koa 中间件
*/
app.use(async(ctx, next) => {
console.log(new Date())
await next();
})
router.get('/', (ctx, next) => {
// ctx.router available
ctx.body = "首页"
}).get('/news', async(ctx, next) => {
ctx.body = " news"
});
app
.use(router.routes())
.use(router.allowedMethods()).listen(3000, () => {
console.log("http://127.0.0.1:3000")
});
中间件
洋葱模型
koa被认为是第二代node web framework,它最大的特点就是独特的中间件流程控制,是一个典型的洋葱模型。koa和koa2中间件的思路是一样的,但是实现方式有所区别,koa2在node7.6之后更是可以直接用
async/await
来替代generator
使用中间件,本文以最后一种情况举例。
举例
const Koa = require('koa');
const app = new Koa();
const PORT = 3000;
// #1
app.use(async (ctx, next)=>{
console.log(1)
await next();
console.log(1)
});
// #2
app.use(async (ctx, next) => {
console.log(2)
await next();
console.log(2)
})
app.use(async (ctx, next) => {
console.log(3)
})
app.listen(PORT);
console.log(`http://localhost:${PORT}`);
访问http://localhost:3000
,控制台打印:
1
2
3
2
1
怎么样,是不是有一点点感觉了。当程序运行到
await next()
的时候就会暂停当前程序,进入下一个中间件,处理完之后才会仔回过头来继续处理。也就是说,当一个请求进入,#1
会被第一个和最后一个经过,#2
则是被第二和倒数第二个经过,依次类推。
错误处理中间件
var Koa = require('koa');
var Router = require('koa-router');
var app = new Koa();
var router = new Router();
/*
koa 中间件
*/
app.use(async(ctx, next) => {
console.log(new Date())
await next();
if (ctx.status == 404) {
ctx.status = 404;
ctx.body = "这是一个404 页面"
}
})
router.get('/', (ctx, next) => {
// ctx.router available
ctx.body = "首页"
}).get('/news', async(ctx, next) => {
ctx.body = " news"
});
app
.use(router.routes())
.use(router.allowedMethods()).listen(3000, () => {
console.log("http://127.0.0.1:3000")
});
post 请求
npm install -D koa-bodyparser
const Koa = require('koa');
var Router = require('koa-router');
const bodyParser = require('koa-bodyparser');
const app = new Koa();
const router = new Router();
/*
koa 中间件
*/
// 使用post请求const
app.use(bodyParser());
app.use(async(ctx, next) => {
console.log(new Date())
await next();
if (ctx.status == 404) {
ctx.status = 404;
ctx.body = "这是一个404 页面"
}
})
router.get('/', (ctx, next) => {
// ctx.router available
ctx.body = "首页"
}).get('/news', async(ctx, next) => {
ctx.body = " news"
}).post('/login', async(ctx) => {
console.log(ctx.request)
ctx.body = ctx.request.body
});
app
.use(router.routes())
.use(router.allowedMethods()).listen(3000, () => {
console.log("http://127.0.0.1:3000")
});
静态web服务
npm i -D koa-static
const Koa = require('koa');
var Router = require('koa-router');
const bodyParser = require('koa-bodyparser');
const app = new Koa();
const router = new Router();
const static = require('koa-static');
/*
koa 中间件
*/
// 使用post请求const
app.use(bodyParser());
// 静态资源中间件
app.use(static(__dirname + "/static"))
app.use(async(ctx, next) => {
console.log(new Date())
await next();
if (ctx.status == 404) {
ctx.status = 404;
ctx.body = "这是一个404 页面"
}
})
router.get('/', (ctx, next) => {
// ctx.router available
ctx.body = "首页"
}).get('/news', async(ctx, next) => {
ctx.body = " news"
}).post('/login', async(ctx) => {
console.log(ctx.request)
ctx.body = ctx.request.body
});
app
.use(router.routes())
.use(router.allowedMethods()).listen(3000, () => {
console.log("http://127.0.0.1:3000")
});
koa 应用生成器
通过应用koa脚手架生成工具 可以快速创建一个基于koa2的应用的骨架。
通过如下命令安装:
$ npm install koa-generator -g
-h
选项可以列出所有可用的命令行选项:
$ koa -h
Usage: koa [options] [dir]
Options:
-h, --help output usage information
-V, --version output the version number
-e, --ejs add ejs engine support (defaults to jade)
--hbs add handlebars engine support
-H, --hogan add hogan.js engine support
-c, --css <engine> add stylesheet <engine> support (less|stylus|compass|sass) (defaults to plain css)
--git add .gitignore
-f, --force force on non-empty directory
例如,下面的示例就是在当前工作目录下创建一个命名为 myapp 的应用。
$ koa koa_demo (创建名称为koa_demo的项目)
create : koa_demo
create : koa_demo/package.json
create : koa_demo/app.js
create : koa_demo/public
create : koa_demo/routes
create : koa_demo/routes/index.js
create : koa_demo/routes/users.js
create : koa_demo/views
create : koa_demo/views/index.jade
create : koa_demo/views/layout.jade
create : koa_demo/views/error.jade
create : koa_demo/bin
create : koa_demo/bin/www
create : koa_demo/public/javascripts
create : koa_demo/public/stylesheets
create : koa_demo/public/stylesheets/style.css
install dependencies:
> cd koa_demo && npm install
run the app:
> SET DEBUG=koa_demo:* & npm start
create : koa_demo/public/images
然后安装所有依赖包:
$ cd koa_demo
$ npm install
启动这个应用(MacOS 或 Linux 平台):
$ DEBUG=myapp npm start
启动项目:
> npm start
然后在浏览器中打开 http://localhost:3000/
网址就可以看到这个应用了。i
通过 koa 应用生成器创建的应用一般都有如下目录结构:
.
├── app.js
├── bin
│ └── www
├── package.json
├── public
│ ├── images
│ ├── javascripts
│ └── stylesheets
│ └── style.css
├── routes
│ ├── index.js
│ └── users.js
└── views
├── error.jade
├── index.jade
└── layout.jade
7 directories, 9 files
通过 koa 应用生长期创建应用只是众多方法中的一种。你可以不使用它,也可以修改它让它符合你的需求,都是开源的嘛!