# 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}次来访`;
});
最后更新: 1/10/2021, 12:12:28 PM