# koa中间件
# koa-json-error 错误处理
可以处理404错误
cnpm i koa-json-error --save
//使用默认配置处理错误
const error =require("koa-json-error")
app.use(error())
//隐藏stack字段
app.use(error({
postFormat:(e,{stack,...rest})=>process.env.NODE_ENV==='production'? rest:{stack,...rest}
}))
"scripts": {
"start": "cross-env NODE_ENV=production node app",
"dev": "nodemon app"
}
cross-env解决windows系统无法读取变量NODE_ENV
# koa-parameter 校验参数
const parameter = require("koa-parameter")
通常是校验请求体的,所以放在其后
app.use(bodyparser())
app.use(parameter(app))//app最好填入,可以加载到ctx上使用
xxx(ctx){
ctx.verifyParams({
name:{type:'string',required:true}//equired不写默认true
age:{type:'number'}
})
}
# koa-body
koa-body 中间件获取上传的文件
cnpm i koa-body --save
const Koa = require('koa');
const koaBody = require('koa-body');
const path = require('path');
const app = new Koa();
app.use(koaBody({
multipart: true,//开启接收文件模式
formidable: {
uploadDir: path.join(__dirname, '/public/uploads'),//文件上传目录
keepExtensions: true,//文件后缀名,默认false
},
}));
app.listen(3000, () => console.log('程序启动在 3000 端口了'));
ctx.request.files.file
upload(ctx) {
const file = ctx.request.files.file;
const basename = path.basename(file.path);
ctx.body = { url: `${ctx.origin}/uploads/${basename}` };
}
const Router = require('koa-router');
const router = new Router();
const { index, upload } = require('../controllers/home');
router.get('/', index);
router.post('/upload', upload);
module.exports = router;
安装koa-body,替换koa-bodyparser,因为koa-bodyparser只支持json和form,koabody还可以支持文件
# koa-static
帮助生成一个静态服务,指定一个文件夹,下面的所有文件都可以通过http访问
const Koa = require('koa');
const koaBody = require('koa-body');
const koaStatic = require('koa-static');
const path = require('path');
const app = new Koa();
const routing = require('./routes');
app.use(koaStatic(path.join(__dirname, 'public')));
app.use(koaBody({
multipart: true,
formidable: {
uploadDir: path.join(__dirname, '/public/uploads'),
keepExtensions: true,
},
}));
app.use(parameter(app));
routing(app);
app.listen(3000, () => console.log('程序启动在 3000 端口了'));
basename+ctx.origin
upload(ctx) {
const file = ctx.request.files.file;
const basename = path.basename(file.path);//返回basename
ctx.body = { url: `${ctx.origin}/uploads/${basename}` };//ctx.origin
}
可以在koaStatic目录下部署html
<form action="/upload" enctype="multipart/form-data" method="POST">
<input type="file" name="file" accept="image/*">
<button type="submit">上传</button>
</form>
# koa-bodyparser
用于解析请求body,支持JSON/Form/Text类型
cnpm install --save koa-bodyparser
const koa = require('koa')
const compose=require('koa-compose')
const bodyParser=require('koa-bodyparser')
const app = new koa()
app.use(bodyParser())
app.use(async(ctx,next)=>{
if(ctx.url==='/'&&ctx.method==='GET'){
ctx.type='html';
let html=`
<h1>登录</h1>
<form method='POST' action='/'>
<p>用户名</p>
<input name='username'/><br>
<p>密码</p>
<input name='password'/><br>
<button type='submit'>提交</button>
</form>
`;
ctx.body=html
}else if(ctx.url==='/'&&ctx.method==='POST'){
let postData=ctx.request.body;
ctx.body=postData;
}
})
app.listen(3000,()=>{
console.log("ok")
})
//显示界面,get方式,然后输入了数据提交后变成了json
//使用中间件
let postData="";
// postData=ctx.request.body;
// ctx.body=postData
// console.log(postData)
//{"username":"www","password":"1234"}
//不使用中间件(数据结构也不一样)
ctx.req.on('data',(data)=>{
postData+=data
})
ctx.req.on('end',()=>{
console.log(postData)
})
//username=www&password=222
//app.use(bodyParser())需要注释掉
# koa-jwt
cnpm i koa-jwt --save
const jwt = require('koa-jwt');
const Router = require('koa-router');
const {
update
} = require('../controllers/users');
const { secret } = require('../config');
const auth = jwt({ secret });
router.patch('/:id', auth, checkOwner, update);
ctx.state.user=user默认位置
# koa-session
const koa=require('koa');
const session=require('koa-session');
let server=new koa();
server.listen(9000,()=>{
console.log("ok")
});
server.keys=[
'asdfgsdfyjur6754erstdyfi7fut6dtrtdfju6y5srgxthj',
'sfghjdt6e5te4rthyj7u6y5t4sregtdhfr6y5',
'fghftdr5sesgtdhyf6dt5resgtdh5grsthy',
'gfhgfsdyjufu65trdhfyu76ytr5gthytreg',
'yjy5rte4ts5yju8kgynbxgrefsrdthyn',
'sedtrhygregdthynhtgrestdhrges',
's5d6yfjtrgesdthyujtrghtjugfhydr6tu7fhgfhfju',
];
server.use(session({}, server));
server.use(async ctx=>{
if(ctx.session['count']){
ctx.session['count']++;
}else{
ctx.session['count']=1;
}
ctx.response.body=`这是你第${ctx.session.count}次来访`;
});