Koa2常用的一些中间件
koa-bodyparser 功能:解析请求体
【Koa2常用的一些中间件】代码实现
const Koa = require('koa');
const bodyParser = require('koa-bodyparser');
const app = new Koa();
app.use(bodyParser());
app.use(async ctx => {
//可以获取到request.body
ctx.body = ctx.request.body;
});
koa-static 功能:处理静态资源
代码实现
const Koa = require('koa')
const static = require('koa-static')const app = new Koa()const staticPath = './static'//即可直接通过'./static',访问到静态资源
app.use(static(
path.join(__dirname, staticPath)
))app.listen(3000, () => {
console.log('端口号是 3000')
})
koa-router 功能:路由
代码实现
const Koa = require('koa');
const Router = require('koa-router');
const app = new Koa();
const router = new Router();
//实现 '/'、'/koa'两个路由层级
router
.get('/',(ctx,next)=>{
ctx.body="Index page";
})
.post('/koa',(ctx,next)=>{
ctx.body="Koa page";
});
app
.use(router.routes())
.use(router.allowedMethods());
app.listen(3000,()=>{
console.log('端口号是 3000');
});
koa-jwt搭配jsonwebtoken 功能:实现jwt鉴权
代码实现
const koa = require('koa');
const koajwt = require('koa-jwt');
const jsonwebtoken = require('jsonwebtoken');
const util = require('util');
const koabody = require('koa-body');
const app = new koa();
const SECRET = 'shared-secret';
// demo,可更换app.use(koabody());
// 中间件对token进行验证
app.use(async (ctx, next) => {
// let token = ctx.header.authorization;
// let payload = await util.promisify(jsonwebtoken.verify)(token.split(' ')[1], SECRET);
return next().catch((err) => {
if (err.status === 401) {
ctx.status = 401;
ctx.body = {
code: 401,
msg: err.message
}
} else {
throw err;
}
})
});
app.use(koajwt({ secret: SECRET }).unless({
// 登录接口不需要验证
path: [/^\/api\/login/]
}));
// 示例
const USER = {
username: 'zhangsan',
password: '123456',
id: 100
}
// 登录接口签发token, 为了简便不使用router
app.use(async (ctx, next) => {
if (ctx.path === '/api/login' && ctx.method === 'POST') {
// 登录
// 判断用户名密码是否匹配
let checkUser = ctx.request.body.username == USER.username && ctx.request.body.password == USER.password;
if (checkUser) {
ctx.body = {
code: 200,
msg: '登录成功',
token: jsonwebtoken.sign(
{ name: USER.username, id: USER.id },// 加密userToken
SECRET,
{ expiresIn: '1h' }
)
}
} else {
// 登录失败, 用户名密码不正确
ctx.body = {
code: 400,
msg: '用户名密码不匹配'
}
}
} else if (ctx.path === '/api/user' && ctx.method === 'GET') {
// 获取用户信息
// 中间件统一验证token
ctx.body = {
code: 200,
data: USER,
msg: '请求成功'
}
}
})
app.listen(3000,()=>{
console.log('端口号是 3000');
});
koa-multer 功能:上传文件
代码实现
const Koa = require('koa');
const Router = require('koa-router');
const multer = require('koa-multer');
const path = require('path');
const app = new Koa();
let storage = multer.diskStorage({
destination: path.resolve('upload'),
filename: (ctx, file, cb)=>{
cb(null, file.originalname);
}
});
let fileFilter = (ctx, file ,cb)=>{
//过滤上传的后缀为txt的文件
if (file.originalname.split('.').splice(-1) == 'txt'){
cb(null, false);
}else {
cb(null, true);
}
}
let upload = multer({
storage: storage,
fileFilter: fileFilter
});
let router = new Router();
router.post('/upload', upload.single('file'), async ctx => {
if (ctx.req.file){
ctx.body = 'upload success';
} else {
ctx.body = 'upload error';
}
});
app.use(router.routes());
app.listen(3000,()=>{
console.log('端口号是 3000');
});
推荐阅读
- 昨夜小楼听风
- 为什么你的路演总会超时()
- 深入理解Go之generate
- 遗憾是生活的常态,但孝顺这件事,我希望每一个人都不留遗憾
- 标签、语法规范、内联框架、超链接、CSS的编写位置、CSS语法、开发工具、块和内联、常用选择器、后代元素选择器、伪类、伪元素。
- 唱歌教学(导致嗓音损坏的几个常见的错误唱歌方法!)
- 迷茫是人生常态
- Hive常见问题汇总
- 数组常用方法一
- 【原创】君子之心,常怀敬畏