/* Koa 的中间件,无论写在前面还是后面,都会先执行中间件的代码, */ /* Koa 路由 get 传值 在 Koa2 中 GET 传值通过request接收,但是接收的方法有两种: query 和 querystring query : 返回的是格式化好的参数对象 querystring : 返回的是请求字符串 */ // 引入模块 const Koa = require("koa"); const router = require("koa-router")(); //引入和实例化路由 // 实例化 var app = new Koa(); // Koa 中间件 /* 以下中间件中,有两个参数,路由地址和函数 ,没有路由只写函数的话,表示 匹配任何路由 ; 如果没有 next ,路由终止, 参数且执行next()函数,则无法向下继续执行; 如果不写 next , 这个路由被匹配到了之后就不会继续向下匹配。 */ // app.use(async (ctx) => { // console.log(new Date()); //返回当前日期时间 2021-01-21T16:31:36.278Z // }); app.use(async (ctx, next) => { console.log("中间件A:第一步a1执行"); await next(); console.log("中间件A:倒数第一步a2执行"); }); // 配置路由,ctx (上下万 context) 整合了 response 和 reject router .get("/", async (ctx) => { ctx.body = "hi 首页123"; //返回数据 相当于 res.writeHead() res.end() }) .get("/news", async (ctx, next) => { // 与先的路由相同,也可以写成两个, console.log("这是路由中间件1"); ctx.body = "这是新闻页面1"; await next(); //这里使用了 await next() ,将会继续向下匹配符合条件的路由,所以 ctx.body 浏览器页面出现的是新闻页面2 }) .get("/news", async (ctx) => { console.log("所有中间件顺着执行完后,执行路由里边的代码,路由执行完成,再倒回去执行中间件的。"); console.log("页面2"); ctx.body = "这是新闻页面2"; }); // 也可以如下写法 router.get("/newscontent", async (ctx) => { ctx.body = "新闻详情页面"; }); // /* Koa 的中间件,无论写在路由前面还是后面,都会先执行中间件的代码, 相比 Express, Express 是匹配到相应的路由后就不继续向下匹配了。 */ app.use(async (ctx, next) => { console.log("中间件B:第二步b1执行"); await next(); console.log("中间件B:倒数第二步b2执行"); }); /* //作用:启动路由 app.use(router.routes()) //作用:这是官方推荐的用法,建议使用 //我们可以看到 router.allowedMethods() 用在了路由匹配 router.routes() 之后, //所以在当所有路由中间件最后调用,此时根据 ctx.status 设置 response 响应头 app.use(router.allowedMethods()) app.use(router.allowOrgins()) //跨域使用 */ app.use(router.routes()).use(router.allowedMethods()); app.listen(3002); console.log("http://localhost:3002"); /* 访问 http://localhost:3002/news 的时候,执行顺序如下: 中间件A:第一步a1执行 中间件B:第二步b1执行 这是路由中间件1 所有中间件顺着执行完后,执行路由里边的代码,路由执行完成,再倒回去执行中间件的。 页面2 中间件B:倒数第二步b2执行 中间件A:倒数第一步a2执行 */