express
原班人马打造的轻量、健壮、富有表现力的nodejs框架。目前koa有koa1和koa2两个版本;koa2依赖Node.js 7.6.0或者更高版本;koa不在内核方法中绑定任何中间件,它仅仅是一个轻量级的函数库,几乎所有功能都必须通过第三方插件来实现。npm i koa
const Koa = require('koa');
const app = new Koa();
app.use(async ctx => {
ctx.body = 'Hello World';
});
app.listen(3000);
koa是包含一组中间件函数的对象;可以将app.use里的函数理解成中间件
//这里的middleWare函数就是一个中间件
let middleWare = async (ctx,next)=>{
console.log("first middleWare");
ctx.body = "hello world";
}
app.use(middleWare);
通过next()将控制转交给另一个中间件;
上述过程也可以通过"洋葱模型“来解释中间件执行顺序
application
是koa的实例,简写appapp.use
将给定的中间件方法添加到此应用程序,分为同步和异步,异步:通过es7中的async和await来处理context
将node中的request
和response
封装到一个对象中,并提供一些新的api提供给用户进行操作;
ctx.app
:应用程序实例引用,等同于app;
ctx.req
: Node 的 request
对象.ctx.res:
Node的
response` 对象.ctx.request
: koa中的Request
对象;ctx.response
: koa中的response
对象;ctx.state
:对象命名空间,通过中间件传递信息;ctx.throw
: 抛出错误;request
及response
别名
koa会把ctx.requset上的属性直接挂载到ctx上如:
ctx.header
ctx.headers
ctx.method
ctx.method=
ctx.url
ctx.url=
同样也会把ctx.response上的属性直接挂载到ctx上如:
ctx.body
ctx.body=
ctx.status
ctx.status=
ctx.status 获取响应状态。默认情况下,
response.status
设置为404
而不是像 node 的res.statusCode
那样默认为200
。
npm i koa-router -S
const KoaRouter = require('koa-router');
const router = new KoaRouter();
router.get('/login', ctx => {
ctx.body = '登陆';
})
app.use(router.routes());
npm i koa-views -S
npm i koa-static
const static = require("koa-static");
//加载静态文件的目录
app.use(static(__dirname+"/static"),{
index:false, // 默认为true 访问的文件为index.html 可以修改为别的文件名或者false
hidden:false, // 是否同意传输隐藏文件
defer:true, // 如果为true,则在返回next()之后进行服务,从而允许后续中间件先进行响应
})
koa-static
,但是可以配置缓存策略npm i koa-static-cache
const KoaStaticCache = require('koa-static-cache');
app.use(KoaStaticCache('./static', {
prefix: '/public', // URL前缀,默认是 '.'
maxAge: 0, // 缓存时间,单位毫秒,默认为0
gzip: true, // 启用gzip压缩传输,默认为true
dynamic: true
}));
npm i koa-body
const koaBody = require('koa-body');
app.use(koaBody({
multipart: true,
// 处理上传的二进制文件
formidable: {
// 上传目录
uploadDir: __dirname + '/public/upload',
// 是否保留上传文件名后缀
keepExtensions: true,
onFileBegin(name, file) {
// console.log('name, file', name, file);
return false;
}
}
}));
const Koa = require('koa');
const KoaRouter = require('koa-router');
const KoaStaticCache = require('koa-static-cache');
// 创建 server 对象
const server = new Koa();
// 创建静态文件代理服务
server.use( KoaStaticCache('./public', {
prefix: '/public',
gzip: true,
dynamic: true
}) );
// 除了上面以 /public 开头的url,其它都会走下面router进行处理
// 创建动态资源(使用router来为动态资源做映射)
// 创建一个router对象
const router = new KoaRouter();
// 用 router 来注册各种需要用到的url资源处理函数
router.get('/', ctx => {
ctx.body = 'Hello';
});
router.get('/getData', ctx => {
// 不是合法的json格式
// ctx.body = "{'name': 'koa'}";
// 必须是双引号
// ctx.set('Content-Type', 'application/json;charset=utf-8');
// ctx.body = '{"name": "koa"}';
// koa 框架内部帮助我们做了一些处理,如果你给body设置一个对象,那么koa内部会把这个对象转成json以后再发送,同时设置头信息application/json;charset=utf-8
ctx.body = {name: 'koa'};
// ctx.type = 'application/json;charset=utf-8';
// 等同下面的代码
// ctx.set('Content-Type', 'application/json;charset=utf-8');
});
router.post('/attachment', upload('/static/attachment'), async ctx => {
console.log(ctx.files);
ctx.body = '上传成功';
});
// 把router对象的routes中间件注册到Koa中
server.use(router.routes());
// 启动服务,并监听指定的端口
server.listen(8081, () => {
console.log('服务启动成功,http://localhost:8081');
});
function upload(dir) {
return koaBody({
// 开启二进制content-type类型的处理
multipart: true,
formidable: {
uploadDir: __dirname + dir,
keepExtensions: true,
onFileBegin(name, file) {
// console.log('name, file', name, file);
return false;
}
}
});
}