我发现不写csdn 笔记就白学了,忘记的速度好快,所以要做好笔记!
我们要复习的是koa ,这个是node 服务器框架,非常优秀,能让我们更好的理解,服务器有哪些功能
const koa=require('koa');
const Router=require('koa-router');
let server=new koa();
server.listen(8080);
//
let router=new Router();
router.use('/user', require('./routers/user'));
server.use(router.routes());
上面是基本路由的写法! 路由支持嵌套路由,我们去 看下 /routers/user 下的模块,默认会找到index.js
以上就是Node 模块化机制
const Router=require('koa-router');
let router=new Router();
router.get('/', async ctx=>{
ctx.body='用户';
});
router.use('/company', require('./company'));
router.use('/admin', require('./admin'));
module.exports=router.routes();
admin.js
const Router=require('koa-router');
let router=new Router();
router.get('/a', async ctx=>{
ctx.body='管理员的a';
});
module.exports=router.routes();
company.js
const Router=require('koa-router');
let router=new Router();
router.get('/a', async ctx=>{
ctx.body='企业的a';
});
module.exports=router.routes();
上面就是嵌套路由,那么好,下面我们就要对上面的路由进行画图解释
koa 中路由机制,很不错,可以嵌套路由,完全可以满足各种需求,我们很开心,为啥好,因为,只要是服务器,那么必须有路由机制,mvc 中c (控制器) 肯定有路由功能!
2, 参数的接收
//新建一个路由
let router=new Router();
//具名参数
router.get('/news/:id/', async (ctx, next)=>{
let {id}=ctx.params;
ctx.body='bbb';
await next();
});
// 第二个参数
router.get('/news/1/', async ctx=>{
let {id}=ctx.params;
ctx.body+='aaa';
});
router.get('/news/', async ctx=>{
let {id}=ctx.query;
console.log(ctx.query);
ctx.body='bbb';
});
通过上面我们可以很开心的接收,get 后面的参数,和 /user/xxx ,这种类似于静态 路由的方式的 参数
下面我就画个图解释下:
koa-static 的使用
const Koa=require('koa');
const Router=require('koa-router');
const static=require('koa-static');
let server=new Koa();
server.listen(8080);
//
let router=new Router();
router.get('/user', async ctx=>{
});
// use + router
// get + 方法
server.use(router.routes());
// 静态方法! 上面的动态路由找不到数据,就到静态路由下去找!
// http://2343324:90/
// 这个应该默认就会 找这个static 目录下的index.html ,这个是应该的!
server.use(static('./static', {
maxage: 86400*1000,
index: '1.html'
}));
也蛮简单的,我们画个图解释下:
localhost:3000/1.html
访问如下的静态文件,由于我们配置了
静态路由那么,它就会到 static 目录下去找
index.html 文件
可以将静态资源文件和路由 配合在一起使用:
const Koa=require('koa');
const Router=require('koa-router');
const static=require('koa-static');
let server=new Koa();
server.listen(8080);
//
let router=new Router();
router.get('/user', async ctx=>{
});
server.use(router.routes());
// 路由配合静态中间, 两个中间键的配合
// 为多个 静态资源设置缓存的静态路由!
let staticRouter=new Router();
staticRouter.all(/(\.jpg|\.png|\.gif)$/i, static('./static', {
maxage: 60*86400*1000
}));
staticRouter.all(/(\.css)$/i, static('./static', {
maxage: 1*86400*1000
}));
staticRouter.all(/(\.html|\.htm|\.shtml)$/i, static('./static', {
maxage: 20*86400*1000
}));
staticRouter.all('', static('./static', {
maxage: 30*86400*1000
}));
server.use(staticRouter.routes());
以上可以为不同的静态资源设置不同的缓存时间,同时我们发现 路由url 支持正则表达式!
文件的上传控件的使用
const Koa=require('koa');
const Router=require('koa-router');
// koa-better-body的使用!
const body=require('koa-better-body');
let server=new Koa();
server.listen(8080);
server.use(body({
uploadDir: './static/upload'
}));
server.use(async ctx=>{
//文件和post数据
console.log(ctx.request.fields);
ctx.body='aaa';
});
这个没啥说的,很简单,就是 koa-better-body 安装需要git 设置到环境变量Path中,否则会 导致无法安装 koa-better-body
模块!
可以看到我们git 的bin 目录配置到了环境变量中了!
cookie的使用,koa 内置cookie
const Koa=require('koa');
const Router=require('koa-router');
let server=new Koa();
server.listen(8080);
//循环秘钥!
server.keys=[
'sdfasdfasdfsadfasddfsdaf',
'gutryurtyhfddyt8uytug',
'tyutryur687tyuyujghjkhj',
];
server.use(async ctx=>{
// cookie 的使用!
//ctx.cookies.set('user', 'blue', {signed: true});
console.log(ctx.cookies.get('user', {signed: true}));
});
session 的使用
const Koa=require('koa');
const Router=require('koa-router');
const session=require('koa-session');
let server=new Koa();
server.listen(8080);
//server 必须加密码!
server.keys=[
'asdfasdfasdfasdfasdf',
'hghjfgjghjkyggfytyurt',
'hjghjkfguig8ygyi8t78i8',
];
// session 的使用
server.use(session({
maxAge: 20*60*1000, //有效期
renew: true //自动续期
}, server));
server.use(async ctx=>{
if(!ctx.session['view']){
ctx.session['view']=0;
}
ctx.session['view']++;
ctx.body=`欢迎你第${ctx.session.view}次来访`;
});
数据库的使用,和一些错误的处理技巧
const Koa=require('koa');
const Router=require('koa-router');
let server=new Koa();
server.listen(8080);
// 这个数据库的操作和 express 没多大关系!就是mysql
// 这个和框架没多大问题!
server.context.db=require('./libs/database');
// 错误处理技巧
server.use(async (ctx, next)=>{
try{
await next();
}catch(e){
ctx.body='错了';
}
});
let router=new Router();
router.all('*', async ctx=>{
try{
await next();
}catch(e){
ctx.body='错了-router';
}
});
router.get('/a', async ctx=>{
ctx.body=div.title;
});
server.use(router.routes());