使用的时候
const app = new Koa2(); //application封装各种方法,如use ,listen
app.use(middleware)
app.listen(1234)
复制代码
application Context
Request Response
Middlewares
Session Cookie复制代码
中间键
...
const mid1 = async(ctx,next)=>{ //async异步中间键
ctx.body= 'hello middleware'
await next() //多个中间键,传递到下一个
ctx.body = ctx.body + "233back function"
//ctx.throw() //错误处理 也可try catch包裹处理错误
//ctx.response.status = 404;
//ctx.response.body = 'Page Not Found'; //错误处理
}
...
app.use(mid1)
app.listen(9527)复制代码
koa-compose 中间键合成
const logger = (ctx, next) => {
console.log(`${Date.now()} ${ctx.request.method} ${ctx.request.url}`);
next();
}
const main = ctx => {
ctx.response.body = 'Hello World';
};
const middlewares = compose([logger, main]);
app.use(middlewares);复制代码
function compose (middleware) {
return function (context, next) {
// last called middleware #
let index = -1
return dispatch(0) //调用开始,指向dispathc(0)
function dispatch (i) {
if (i <= index)
return Promise.reject(new Error('next() called multiple times'))
index = i
const fn = middleware[i] || next
if (!fn) return Promise.resolve()
try {
return Promise.resolve(fn(context, function next () {
return dispatch(i + 1) //循环调用,嵌套
}))
} catch (err) {
return Promise.reject(err)
}}}
}复制代码
koa-router 路由
const about = ctx => {
ctx.response.type = 'html';
ctx.response.body = '<a href="/">Index Page</a>';
};
const main = ctx => {
ctx.response.body = 'Hello World';
ctx.response.redirect('/'); //路由重定向
};
app.use(route.get('/', main));
app.use(route.get('/about', about));复制代码
装饰器---实现路由模块拆分
class Boy{
@speak('what')
run() {
console.log('do something beore')
}
}
function speak(dosomething){
return function(target,key,descriptor){ //target被装饰的类,key修饰的方法,descriptor详细配置
console.log(target)
console.log(key)
console.log(descriptor)
target.dosomething= dosomething
return descriptor
}
}
const mark = new Boy()
mark.run()
--------
@controller('/api/v0/movies')
export class movieController{
@get('/:id')
@amin(['adminWebsit']) //检查是否有管理员权限
async getMovieDetail(ctx,next){
...
}
}复制代码
koa-static 静态资源
const path = require('path');
const serve = require('koa-static');
const main = serve(path.join(__dirname));
app.use(main);复制代码
cookie ****用法:服务端设置ctx.cookie
const main = function(ctx) {
const n = Number(ctx.cookies.get('view') || 0) + 1; //改变数据
ctx.cookies.set('view', n); //,数据变化
ctx.response.body = n + ' views'; //每次展示cookie的时候
}复制代码
koa-body表单
const koaBody = require('koa-body');
const main = async function(ctx) {
const body = ctx.request.body;
if (!body.name) ctx.throw(400, '.name required');
ctx.body = { name: body.name };
};
app.use(koaBody());
执行: curl -X POST --data "name=Jack" 127.0.0.1:3000
上传数据name=Jack到127.0.0::3000地址处
//显示 {"name":"Jack"} 复制代码
文件上传
const os = require('os');
const path = require('path');
const koaBody = require('koa-body');
const main = async function(ctx) {
const tmpdir = os.tmpdir(); //拿到当前根目录
const filePaths = [];
const files = ctx.request.body.files || {}; //拿到要上传的文件
for (let key in files) { //文件遍历
const file = files[key];
const filePath = path.join(tmpdir, file.name);
const reader = fs.createReadStream(file.path);
const writer = fs.createWriteStream(filePath);
reader.pipe(writer); //文件遍历 写入
filePaths.push(filePath); //输出到filePath
}
ctx.body = filePaths;
};
app.use(koaBody({ multipart: true }));
执行:
$ curl --form upload=@/path/to/file http://127.0.0.1:3000
显示: ["/tmp/file"]
复制代码
session
const Koa = require('koa')
const logger = require('koa-logger')
const session = require('koa-session')
const app = new Koa()
app.key= ['Hi Luke'] //
app.use(logger())
app.use(session(app)) //这儿省略用了默认config,重要参数
app.listen(2333)复制代码