Node KOA框架入门
2024-10-01 12:01:42
KOA:
v1 generator
v2 过渡版 generator&async
v3 async/await
koa
koa不带路由 因此得cnpm i koa-router -D
路由:1.嵌套、2.参数
0.普通路由
const koa = require('koa');
const Router = require('koa-router'); let server = new koa();
server.listen(,()=>{console.log('success');}); //普通路由
let router = new Router();
router.get('/a', async ctx=>{
//ctx:上下文对象
ctx.body='aaa';
ctx.body+='bbb';
console.log(ctx.body);
})
//把router怼给server才能生效
server.use(router.routes());
1.嵌套路由
//1.嵌套路由:
/user
/company
/person
/admin
/news
/sport
/woman
/man
/car
...
(1).项目目录
(2).index.js
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();
(3).admin.js和company.js
const Router = require('koa-router'); let router = new Router(); router.get('/a',async ctx=>{
ctx.body='管理员的a';
}) module.exports=router.routes();
const Router = require('koa-router');
let router = new Router();
router.get('/a',async ctx=>{
ctx.body='企业的a';
});
module.exports=router.routes();
(4).server.js
let router = new Router();
router.use('/user',require('./routers/user'));
server.use(router.routes());
运行node server.js,在浏览器输入"localhost:8520/user/admin/a",页面上则显示"管理员的a";
输入"localhost:8520/user/company/a",页面上则显示"企业的a"。
2.参数
//2.参数:
http://localhost:8520/news/12
http://localhost:8520/news/123/889
http://localhost:8520/news/123/555/146 quretion1: 用?id=xxx传参和/:id的区别
urlencoded http://aaa.com/user?a=12&b=5
params http://aaa.com/user/12/5 urlencoded params
顺序灵活 顺序是死的
可以省略 不可省略的
不利于SEO 利于SEO(因为地址是静态的)
(1).项目目录
(2).参数params
const Koa = require('koa');
const Router = require('koa-router'); let server = new Koa();
server.listen(); let router = new Router(); router.get('/news/:id',async ctx=>{
console.log(ctx.params);
let {id} = ctx.params
ctx.body=`新闻${id}`;
}); router.get('/news/:id/:id2',async ctx=>{
console.log(ctx.params);
let {id,id2} = ctx.params
ctx.body=`新闻${id}_${id2}`;
}); router.get('/news/:id/:id2/:id3',async ctx=>{
console.log(ctx.params);
let {id,id2,id3} = ctx.params
ctx.body=`新闻${id}_${id2}_${id3}`;
}); server.use(router.routes());
(3).参数urlencoded
const Koa = require('koa');
const Router = require('koa-router'); let server = new Koa();
server.listen(,()=>{console.log('success');}); let router = new Router(); router.get('/news/',async ctx=>{
console.log(ctx.query);
let {id} = ctx.query;
}); server.use(router.routes());
熟悉ctx对象
熟悉ctx对象 server.context:相当于ctx的prototype
所以server.context适合放全局的东西 ctx.request
ctx.response 信息:
ctx.method 请求方法
ctx.url 请求地址
ctx.path 请求路径
ctx.query get数据
ctx.ip 客户端ip
ctx.headers 请求头
比较方便的报错方法
比较方便的报错方法: ctx.throw //报错并且退出
eg:
if(!ctx.query.user || !ctx.query.pass){
ctx.throw(,'user and password is required')
}else{
ctx.body='成功';
} ctx.assert() //断言测试
ctx.assert(条件,code,msg)==if(!条件)ctx.throw
eg:
ctx.assert(ctx.query.user,,'username is required')
koa-static
cnpm i koa-static -d
const static = requiere('koa-static')
新建static文件夹
static文件夹下面新建1.html
server.js加上
server.use(static('./static'));
即可
let staticRouter = new Router();
server.use(static('./static'),{
maxage:*, //缓存时间,可降低服务器压力
index: '1.html' //默认文件
}) staticRouter.all(/(\.jpg|\.png|\.gif)/i,static('./static',{
maxage:**
})) //如果是jpg,png,gif文件那就缓存两个月
staticRouter.all(/(\.css)$/i,static('./static',{
maxage:**
})); //如果是css文件那就缓存一天
staticRouter.all(/(\.html|\.htm|\.shtml)$/i,static('./static',{
maxage:**
}));
staticRouter.all('',static('./static',{
maxage:**
})); //其他文件缓存30天 server.use(staticRouter.roures());
koa-beffer-body
cnpm i koa-better-body -D
ctx.request.fields
const Koa = require('koa');
const Router = require('koa-router');
consst body = require('koa-better-body');
let server = new Koa();
server.listen();
server.use(body({
//上传的文件储存在这里
uploadDir:'./static/upload'
}))
server.use(async ctx=>{
//文件和post数据
console.log(ctx.request.fields);
ctx.body='aaa';
}); 接着form表单设置文件上传enctype='multipart/.....'
cookie(koa里cookie是自带的)
const Koa = require('koa');
const Router = require('koa-router');
let server = new Koa();
server.listen();
server.keys=['asdfasdf','asdfasdfa',''...]; //滚动秘钥,加密
server.use(async ctx=>{
ctx.cookies.set('user','blue',{maxAge: **,signed: true //签名});
ctx.cookies.get('user',{signed:true});
})
session
cnpm i koa-session -D
const Koa = require('koa');
const Router = require('koa-router');
const session = require('koa-session);
let server = new Koa();
server.listen();
//强制签名
server.keys=['asdfasdfas','asdfasdfasdf','sadfasdfasdf'...];
server.use(session({
maxAge:**, //有效期。20分钟,时间越长安全性越低,服务器负担越大
renew:true, //session自动续期。
},server));
server.use(async ctx=>{
if(!ctx.session['view']){
ctx.session['view']=;
}
ctx.session['view']++;
ctx.body=`欢迎您第${ctx.session.view}次来访`;
})
数据库 co-mysql //koa-mysql已经废了
const Koa = require('koa');
const Router = require('koa-router);
const mysql = require('mysql');
const co = require('co-mysql');
let conn =mysql.createPool({
host:'localhost',
user:'root',
password:'',
database:'node_sql'
});
let db = co(conn);
let server = new Koa();
server.listen(;)
server.context.db=db;
server.use(async (ctx,new)=>{
try{
await next();
}catch(e){
ctx.body='错了';
}
});
server.use(async ctx=>{
let data = await ctx.db.query('SELECT * FROM user');
ctx.body=data;
});
最新文章
- C# BackgroundWorker的使用
- 一个Tomcat多端口多项目部署
- 字体大小自适应纯css解决方案
- 奇怪的Hibernate——当?遇上%
- Linq 动态查询排序
- 手机web开发Repeater四层嵌套
- iOS自学之NSOperation、NSOperationQueue、Background
- Ubuntu 12.04 64bit 配置完android 5.0编译环境后出现“could not write bytes: Broken pipe.”而无法进入输入帐号密码的登陆界面
- iOS之layout方法-layoutSubviews、layoutIfNeeded、setNeedsLayout
- GCC相关的环境变量
- C#之多线程编程
- MySQL5.7.11(ZIP)安装
- 了解Sql
- VHD进阶:差分VHD备份系统
- Mybatis的@Options注解
- 010.Controller methods and views --【控制器方法与视图】
- ASP.NET Core WebApi中简单像素转换跟踪实现
- Java_基础篇(数组排序)
- 利用 postMessage 进行数据传递 (iframe 及web worker)及问题
- ionic 确认提示操作框