关于koa2的基础知识

1、koa2 路由配置

const Koa = require('koa')
const router = require('koa-router')()

const app = new Koa()

router
.get('/', async (ctx) => {
  ctx.body = '首页'
})
.get('/news', async (ctx) => {
  ctx.body = '新闻页'
})

// 启动路由
// router.allowedMethods()的作用:当所有路由中间件最后调用,此时根据 ctx.status 设置 response 响应头
app
  .use(router.routes())
  .use(router.allowedMethods())

app.listen(3000, () => {
  console.log('服务器已启动')
})

2、koa2 中的 get 传值以及获取 get 传值

  • 在 koa2 中,GET 传值通过 request 参数接收,但接收的方式有2种,query 和 querystring
    1、query:返回的是格式化好的参数对象
    2、querystring:返回的是请求字符串
const Koa = require('koa')
const router = require('koa-router')()

const app = new Koa()

router
.get('/', async (ctx) => {
  ctx.body = '首页'
})
.get('/news', async (ctx) => {
  // 从 ctx 中获取 get 传值
  console.log(ctx.query); // {id: '123'}
  console.log(ctx.querystring); // id=123&name=lisi
  console.log(ctx.url); // 获取 url 地址
  
  // 从 ctx 里面的 request 获取 get 传值
  console.log(ctx.request.query);
  console.log(ctx.request.querystring);
  console.log(ctx.request.url);
  
  
  ctx.body = '新闻页'
})

// 启动路由
// router.allowedMethods()的作用:当所有路由中间件最后调用,此时根据 ctx.status 设置 response 响应头
app
  .use(router.routes())
  .use(router.allowedMethods())

app.listen(3000, () => {
  console.log('服务器已启动')
})

3、koa2 动态路由

const Koa = require('koa')
const router = require('koa-router')()

const app = new Koa()

router
.get('/', async (ctx) => {
  ctx.body = '首页'
})
.get('/news/:name', async (ctx, next) => {
  // 获取动态路由的传值
  console.log(ctx.params); // { name: 'sjb' }
  ctx.body = '新闻页'
})

// 启动路由
// router.allowedMethods()的作用:当所有路由中间件最后调用,此时根据 ctx.status 设置 response 响应头
app
  .use(router.routes())
  .use(router.allowedMethods())

app.listen(3000, () => {
  console.log('服务器已启动')
})

4、koa2 中 ejs 模板引擎的使用

  • 安装 koa-views 和 ejs
    npm install --save koa-views
    npm install ejs --save
const Koa = require('koa')
const router = require('koa-router')()
// 引入 koa-views 配置中间件
const views = require('koa-views')
const app = new Koa()
// ejs 模板引擎有2种配置方式,区别是模板文件的后缀名不同
// app.use(views('views', {
//   map: {html: 'ejs'} // views 文件中的模板后缀名应为 .html
// }))
app.use(views('views', {
  extension: 'ejs' // views 文件中的模板后缀名应为 .ejs
}))
// koa中使用ejs
router.get('/news', async (ctx) => {
  let title = 'sjb'
  await ctx.render('index', {
    title: title // 绑定数据
  })
})

// 启动路由
// router.allowedMethods()的作用:当所有路由中间件最后调用,此时根据 ctx.status 设置 response 响应头
app
  .use(router.routes())
  .use(router.allowedMethods())

app.listen(3000, () => {
  console.log('服务器已启动')
})
  • Ejs引入模板
    <%- include public/header.ejs %>
  • Ejs绑定数据
    <%=title%>
  • Ejs绑定html数据
    <%-h%>
  • Ejs模板判断语句
 <% if(true){ %>
        true
<%} else{ %>
        false
<%} %>
  • Ejs模板中循环数据
<% for(let i = 0; i < list.length; i++) { %>   
  <% =list[i] %>
    <% } %>

5、koa2 中 ejs 模板引擎在中间件中配置公共数据

const Koa = require('koa')
const router = require('koa-router')()
const views = require('koa-views')
const app = new Koa()

app.use(views('views', {
  extension: 'ejs' 
}))

// 注意:我们需要在每一个路由的 render 里面都要渲染一个公共的数据
/* 
ctx.state = {  // 放在中间件里面
  session: this.session, // 公共数据
  title: 'app'
}; 
*/
// 写一个中间件配置公共的信息
app.use(async (ctx, next) => {
  ctx.state = {
    session: 'session'
  };
  await next()
  // await ctx.render('user', {
  //   user: 'John'
  // });
});

router.get('/news', async (ctx) => {
  let list = ['sjb','s','d']
  await ctx.render('index', {
    list
  })
})

// 启动路由
// router.allowedMethods()的作用:当所有路由中间件最后调用,此时根据 ctx.status 设置 response 响应头
app
  .use(router.routes())
  .use(router.allowedMethods())

app.listen(3000, () => {
  console.log('服务器已启动')
})

6、koa2 中 cookies 的使用

  • 中文字符与 base64 字节码的相互转化
const Koa = require('koa')
const router = require('koa-router')()
const render = require('koa-art-template')
const path = require('path')
const app = new Koa()

render(app, {
  root: path.join(__dirname, 'views'), // 模板视图的位置
  extname: '.html', // 模板的后缀名
  debug: process.env.NODE_ENV !== 'production' // 是否开启调试模式
})

router
.get('/', async (ctx) => {
  let data = '苏'
  let val = new Buffer(data).toString('base64') // 设置cookies时,先把中文字符转化为 base64 字节码
  ctx.cookies.set('name', val, {
    maxAge: 1000*60*60
  })
  await ctx.render('index')
})
.get('/news', async (ctx) => {
  
  let data = ctx.cookies.get('name')
  let val = new Buffer(data, 'base64').toString() // 取cookies值时,再用 base64 字节码转化成中文字符
  console.log(val)
  ctx.body = '新闻页' + val
})

// 启动路由
// router.allowedMethods()的作用:当所有路由中间件最后调用,此时根据 ctx.status 设置 response 响应头
app
  .use(router.routes())
  .use(router.allowedMethods())

app.listen(3000, () => {
  console.log('服务器已启动')
})

7、koa2 中 session 的使用

const Koa = require('koa')
const router = require('koa-router')()
const render = require('koa-art-template')
const path = require('path')
const session = require('koa-session')
const app = new Koa()

render(app, {
  root: path.join(__dirname, 'views'), // 模板视图的位置
  extname: '.html', // 模板的后缀名
  debug: process.env.NODE_ENV !== 'production' // 是否开启调试模式
})
// 配置 session
app.keys = ['some secret hurr'] // session 签名
const CONFIG = {
   key: 'koa:sess',   // cookie key (default is koa:sess)
   maxAge: 50000,  // cookie 的过期时间 maxAge in ms (default is 1 days)
   autoCommit: true, // 自动将 session 值提交到请求头部上
   overwrite: true,  // 是否会覆盖之前设置同名的
   httpOnly: true, // cookie 是否只有服务器端可以访问 httpOnly or not (default true)
   signed: true,   // 签名默认 true
   rolling: false,  // 在每次请求时强行设置 cookie,这将重置 cookie 过期时间(默认:false)
   renew: false,  // (boolean) renew session when session is nearly expired,
   sameSite: null, // (string) session cookie sameSite options (default null, don't set it)
}
app.use(session(CONFIG, app))

router
.get('/', async (ctx) => {
  ctx.session.username = 'sjb'
  await ctx.render('index')
})
.get('/news', async (ctx) => {
  console.log(ctx.session.username)
  ctx.body = '新闻页' + ctx.session.username
})

// 启动路由
// router.allowedMethods()的作用:当所有路由中间件最后调用,此时根据 ctx.status 设置 response 响应头
app
  .use(router.routes())
  .use(router.allowedMethods())

app.listen(3000, () => {
  console.log('服务器已启动')
})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容