1 环境搭建
1 下载koa-generator
npm install koa-generator -g
2 执行这个命令 koa2 my-project 生成一个my-project的项目
3 进入项目 cd my-project
4 安装依赖 cnpm i
5 npm start 即可
6 koa 的打包的文档
var Koa=require("koa")
var app=new Koa();
//配置路由
//中间件
app.use(async (ctx)=>{
ctx.body="你好 菜鸟"
})
app.listen(3000)
4. async 异步(就是将一个函数变为异步函数) await (等待异步 执行 获取异步函数的数据 )
需要注意的是:
1 await 只能用在异步函数中
2 异步函数必须是一个return 可以是对象 字符等 数据 await 才能得到数据 不return的话 函数也会执行 但是得不到数据了(好像是返回一个空的promise对象)
3 await 会将异步转化为同步。同时 会执行这个函数
4 async 返回的是一个promise对象
async function getData(){
console.log("123")
}
async function sayData(){
let data=await getData();
// console.log(data)
}
sayData();
路由
需要安装 (根据不同的请求地址 显示不同的内容)
npm install --save koa-router
写了中间件(无论中间件写在哪里都会先执行 要想最后执行到路由 必须用 await next()) 这样才能执行路由
分三部分
1 引用路由 2 配置路由 3 启动路由
var Koa=require("koa");
var Router =require("koa-router");
var app=new Koa();
var router =new Router();
// 路径 回调函数 /默认地址
router.get("/",async (ctx)=>{
ctx.body="首页"
})
router.get("/fruit",async (ctx)=>{
ctx.body="水果"
})
router.get("/people",async (ctx)=>{
ctx.body="朱小明"
})
//必须启动路由
app.use(router.routes())
app.use(router.allowedMethods()) //建议写上 但不是必须
app.listen(3000)
get 传值以及获取get 传的值
// 这是代码片段 整体代码与上面的代码段 除了这里别的都一样
router.get("/people",async (ctx)=>{
// 从ctx中读取get值 获取的是对象整个参数对象 还有一种querystring 是获取的整个字符串
console.log(ctx.query)
//获取整体信息
console.log(ctx.request)
ctx.body="朱小明"
})
动态路由
//动态路由 :banana 动态路由名 在网址中的值 是他的值 {banana:"apple"}
router.get("/fruit/:banana",async (ctx)=>{
console.log(ctx.params)
ctx.body="水果"
})
//一下传多个值
router.get("/fruit/:banana/:number",async (ctx)=>{
console.log(ctx.params)
ctx.body="水果"
})
//这样的需要注意 url 必须两个值都有 同时{banana:"", number:""}
中间件
匹配路由之前或者配置路由之后的一些操作(页面显示之前 比如验证你是否通过验证 页面显示之后 做的一些操作)
应用级中间件(匹配路由之前)
var Koa=require("koa");
var Router =require("koa-router");
var app=new Koa();
var router =new Router();
// 中间件
//可以写两个参数 第一个是url 第二个是回调函数 只写一个回调函数表示 匹配所有的路由
app.use(async(ctx,next)=>{
console.log(new Date());
console
await next();
})
// 路径 回调函数 /默认地址
router.get("/",async (ctx)=>{
ctx.body="首页"
})
//动态路由 :banana 动态路由名 在网址中的值 是他的值 {banana:"apple"}
router.get("/fruit/:banana",async (ctx)=>{
console.log(ctx.params)
ctx.body="水果"
})
//get 传值 直接在地址栏写参数
router.get("/people",async (ctx)=>{
// 从ctx中读取get值 获取的是对象整个参数对象 还有一种querystring 是获取的整个字符串
console.log(ctx.query)
//获取整体信息
console.log(ctx.request)
ctx.body="朱小明"
})
//必须启动路由
app.use(router.routes())
app.use(router.allowedMethods()) //建议写上 但不是必须
app.listen(3000)
路由中间件(需要注意的是 两个路由名字一样才可以 await next() )
router.get("/people",async (ctx,next)=>{
// 从ctx中读取get值 获取的是对象整个参数对象 还有一种querystring 是获取的整个字符串
//获取整体信息
console.log("111")
await next()
})
router.get("/people",async (ctx)=>{
// 从ctx中读取get值 获取的是对象整个参数对象 还有一种querystring 是获取的整个字符串
//获取整体信息
console.log("222")
ctx.body="小李子"
})
koa的中间件 永远在路由之前执行不论你写在哪里
错误处理中间件
app.use(async(ctx,next)=>{
console.log("aaa");
await next();
if(ctx.status==404){
ctx.status=404;
ctx.body="这是一个404"
}
})
// 就是按照顺序执行的 当访问路由(地址)的时候 先执行console 然后执行next() (路由)
// 路由执行完以后 判断是否找到 找不到执行if 找到了 先执行路由 再继续执行 next() 下面的命令
多个中间件 多个路由 顺序问题 (代码帮助理解 其实就是根据顺序执行下去 但是 中间件的next 是中间件 路由的next 是路由)
var Koa=require("koa");
var Router =require("koa-router");
var app=new Koa();
var router =new Router();
// 中间件
//可以写两个参数 第一个是url 第二个是回调函数 只写一个回调函数表示 匹配所有的路由
app.use(async(ctx,next)=>{
console.log("aaa");
await next();
if(ctx.status==404){
ctx.status=404;
ctx.body="这是一个404"
}
console.log("ff");
})
app.use(async(ctx,next)=>{
console.log("bbb");
await next();
if(ctx.status==404){
ctx.status=404;
ctx.body="这是一个404"
}
console.log("ee");
})
//匹配到/之后继续向下匹配路由
router.get("/",async (ctx,next)=>{
console.log("继续向下")
})
router.get("/people",async (ctx,next)=>{
// 从ctx中读取get值 获取的是对象整个参数对象 还有一种querystring 是获取的整个字符串
//获取整体信息
console.log("cc")
await next()
})
router.get("/people",async (ctx)=>{
// 从ctx中读取get值 获取的是对象整个参数对象 还有一种querystring 是获取的整个字符串
//获取整体信息
console.log("dd")
ctx.body="小李子"
})
//必须启动路由
app.use(router.routes())
app.use(router.allowedMethods()) //建议写上 但不是必须
app.listen(3000)