even

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

1、介绍

  Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。

2、安装

npm i koa

 开发小技巧:在使用node进行为开的时候,可以安装node的热重载模块 supervisor, 当代码更新时会自动更新服务

#安装
node i supervisor -g
#启动
supervisor app.js

 3、koa的处理流程

 在koa里面通过use方法进行注册中间件

 入门案例

const Koa = require('koa'); //引入koa模块

//创建koa服务对象, 相当node里的http.createServer()
const app = new Koa();

app.use((ctx, next) => {
    ctx.body = 'hello';
    next()
})

// 相当于当调用next后,下面的中间件才会执行,可以判断当前用户是否有权限,如果有权限再调用next()
app.use((ctx, next) => {
    ctx.body += ' word'
})

app.listen(8079)  //监听服务端口

4、koa对象中的application模块

application对象,即 new Koa() 得到的实例对象,保存了应用全局状态以及其他对象,后面的Context、Reqeust、Response对象都是该对象下的子对象

  1.  - use(callback)

  2.  - callback(context, next)
     - context 对象 每一次请求都会包装一个context对象
     - next 每一个中间件都是一个迭代器
     - 异步中间件
      use(async callback)

  3. - app.on('error', err => {})

具体的见官网

 5、常用中间件及使用

koa本身只是实现了简单的功能,更多的功能是依靠第三方插件来完成的,大部份插件可以参看 https://github.com/koajs/koa/wiki

koa-static-cache:静态文件代理服务

相应的用法在官网  https://github.com/koajs/static-cache

安装

npm i koa-static-cache

使用

const Koa = require('koa'); //引入koa模块
const KoaStaticCache = require('koa-static-cache')  //引入koa静态资源模块
const path = require('path')

const app = new Koa();

app.use(KoaStaticCache(path.resolve(__dirname, './static'), {
    gzip: true,         //是否开启gzip压缩
    prefix: '/public',   //访问时地址的前缀  如 http: //127.0.0.1:8079/public/a 会自动访问到static文件夹下的a文件, 注意这里需要加上/
    maxAge: 0,          //表示静态资源的缓存时间,默认是0
}))

app.use((ctx, next) => {
    //这个自身逻辑代码
})

app.listen(8079)  //监听服务端口

 koa-router:路由

 模块安装

npm i koa-router

使用

常规用法

const Router = require('koa-router') //引入模块
const homeRouter = new Router();  //实例化Router对象
homeRouter.get('/', (ctx, next) => {
    ctx.body = 'this is home'
})
app.use(homeRouter.routes())    //把路由注册到koa对象中

嵌套路由

  const parent = new Router();

  const child = new Router();

  parent.use('/p', child.routers())

  app.use(parent.routers())

//实例化父级路由
const userRouter = new Router();
//实例化子路由
const child = new Router();
//配置子路由
child.get('/', (ctx, next) => {
    ctx.body = 'this is user Router home'
})
child.get('/add', (ctx, next) => {
    ctx.body = 'this is user Router add page'
})
//把子路由注册到父级路由中
userRouter.use('/user', child.routes())
//把根路由注册到koa框架中
app.use(userRouter.routes())

 定义前缀实现嵌套路由

//实例化一个有前缀的路由
const play = new Router({
    prefix: '/play'     //注意: 这里的play需要带上’/‘
})
//注册/play首页的页面
play.get('/', (ctx, next) => {
    ctx.body = 'this is play home'
})
//注册/play/center页面
play.get('/center', (ctx, next) => {
    ctx.body = 'this is play center'
})
//在koa框架中注册play路由
app.use(play.routes())

 动态路由

//实例化一个有前缀的路由
const play = new Router({
    prefix: '/play'     //注意: 这里的play需要带上’/‘
})
//注册/play首页的页面
play.get('/', (ctx, next) => {
    ctx.body = 'this is play home'
})
//注册/play/center页面,并且实现动态路由
play.get('/center/:id/', (ctx, next) => {
    ctx.body = 'this is play center' + ctx.params.id
})
//在koa框架中注册play路由
app.use(play.routes())


//把根路由注册到koa框架中
app.use(userRouter.routes())

Router的地址生成器

Router.url('/user/add/:id', {id: 1}, {query: {order: 'desc'}})

会生成  /user/add/1?order=desc这样的一个地址

 koa-views:模板引擎

npm i koa-views

如果需要引用其他的模板引擎,那么需要安装指定的模板引擎

如果  nunjucks 模板引擎使用可见 nunjucks官方文档

const Koa = require('koa'); //引入koa模块
const KoaStaticCache = require('koa-static-cache')  //引入koa静态资源模块
const Router = require('koa-router')
const View = require('koa-views')   //引入模板引擎
const path = require('path')

const app = new Koa();

//访问的是静态资源
app.use(KoaStaticCache(path.resolve(__dirname, './static'), {
    gzip: true,         //是否开启gzip压缩
    prefix: '/public',   //访问时地址的前缀  如 http: //127.0.0.1:8079/public/a 会自动访问到static文件夹下的a文件, 注意这里需要加上/
    maxAge: 0,          //表示静态资源的缓存时间,默认是0
}))

const render = View(path.resolve('./template'), {
    autoRender: true,   //是否使用ctx.body去接收并且渲染模板,默认是true, 区别在于如果设置为false, 渲染的时候需要用return关键字,否则不用
    extension: 'html', //如果设置,那么在render的时候可以无需写后缀,如果ctx.render('abc')无设置 ctx.render('abc.html')
    map: { html: 'nunjucks' } //定义使用的后端渲染的模板引擎

})

app.use(render)

const homeRouter = new Router();
homeRouter.get('/', async(ctx, next) => {
    await ctx.render('test', {name: 'message', age: '20'})
})
app.use(homeRouter.routes())

app.listen(8079)  //监听服务端口

koa-nunjucks-2模块的使用

该模块可以替代上面的koa-views + nunjucks 的模块,并且使用更方便,可以在模板内使用include  extends等方法,祥细用法见nunjucks 官网

安装 

npm i koa-nunjucks-2
const Koa = require('koa'); //引入koa模块
const KoaStaticCache = require('koa-static-cache')  //引入koa静态资源模块
const Router = require('koa-router')
const path = require('path')
const nunjucks = require('koa-nunjucks-2');

const app = new Koa();

//访问的是静态资源
app.use(KoaStaticCache(path.resolve(__dirname, './static'), {
    // gzip: true,         //是否开启gzip压缩
    prefix: '/public',   //访问时地址的前缀  如 http: //127.0.0.1:8079/public/a 会自动访问到static文件夹下的a文件, 注意这里需要加上/
    // maxAge: 0,          //表示静态资源的缓存时间,默认是0
}))

app.use(nunjucks({
    ext: 'html',  // 指定视图文件默认后缀
    path: path.resolve('./template'),  // 指定视图目录
    nunjucksConfig:{
        trimBlocks: true   // 开启转义,防止XSS
    }
}))

let list = [
    {name: 'aaa', age: 10, sex: 1},
    {name: 'bbb', age: 11, sex: 0},
    {name: 'ccc', age: 12, sex: 1},
    {name: 'ddd', age: 13, sex: 1},
    {name: 'eee', age: 14, sex: 0},
    {name: 'fff', age: 15, sex: 1},
    {name: 'ggg', age: 16, sex: 0},
    {name: 'hhh', age: 17, sex: 0},
]

const homeRouter = new Router();
homeRouter.get('/', async(ctx, next) => {
    await ctx.render('home', {name: 'aaa', list})
})

homeRouter.get('/test', async(ctx) => {
    ctx.redirect('/')
})

app.use(homeRouter.routes())

app.listen(8079)  //监听服务端口

koa-bodyparser:body解析

 安装

npm i koa-bodyparser

使用

const Koa = require('koa'); //引入koa模块
const KoaStaticCache = require('koa-static-cache')  //引入koa静态资源模块
const Router = require('koa-router')
const path = require('path')
const BodyParser = require('koa-bodyparser');

const app = new Koa();
const bodyParser = new BodyParser()     //实例化接收请求参数的方法
app.use(bodyParser)  //接入koa框架

//访问的是静态资源
app.use(KoaStaticCache(path.resolve(__dirname, './static'), {
    // gzip: true,         //是否开启gzip压缩
    prefix: '/public',   //访问时地址的前缀  如 http: //127.0.0.1:8079/public/a 会自动访问到static文件夹下的a文件, 注意这里需要加上/
    // maxAge: 0,          //表示静态资源的缓存时间,默认是0
}))

let list = [
    {name: 'aaa', age: 10, sex: 1}
]

const homeRouter = new Router();
homeRouter.get('/', async(ctx, next) => {
    await ctx.render('home', {name: 'aaa', list})
})

homeRouter.put('/test', async(ctx) => {
    console.log(ctx.request.body)           //获取到当前请求的参数
    ctx.response.body = {                   //返回json
        ...ctx.request.body
    }
})

app.use(homeRouter.routes())

app.listen(8079)  //监听服务端口

 sequelize  =》 orm框架在koa中的使用

 1、介绍

  koa在使用数据库的时候,可以使用orm数据库框架

  Sequelize 是一个基于 promise 的 Node.js ORM, 目前支持 Postgres, MySQL, MariaDB, SQLite 以及 Microsoft SQL Server. 它具有强大的事务支持, 关联关系, 预读和延迟加载,读取复制等功能。

2、安装

npm install --save sequelize


//根据需要再安装如下的依赖
$ npm install --save pg pg-hstore # Postgres
$ npm install --save mysql2   //mysql需要安装的依赖
$ npm install --save mariadb
$ npm install --save sqlite3
$ npm install --save tedious # Microsoft SQL Server

3、入门使用

const Sequelize = require('sequelize')   //引入依赖


const database = new Sequelize('koa', 'root', 'password', { //分别是 数据库名, 数据库账号, 数据库密码
    host: '127.0.0.1',      //host地址
    port: '3306',           //
    dialect: 'mysql' //指定连接的数据库类型
})

database.authenticate().then(() => {
    console.log('成功')     //数据库连接成功
}).catch(err => {
    console.log(err, '失败') //数据库连接失败
})

4、定义模型

具体配置祥见官网,这里介绍自动生成模型的方法  sequelize-auto

安装
npm install sequelize-auto
使用
sequelize-auto -h <host> -d <database> -u <user> -x [password] -p [port]  --dialect [dialect] -c [/path/to/config] -o [/path/to/models] -t [tableName]


例子
sequelize-auto -h 127.0.0.1 -d koa -u root -x password -p 3306  --dialect mysql -o "./models"

//相当于表示把koa数据库中的所有表建立对应的模块到项目的 model文件下

注意:会自动生成./models/init-models.js该文件,这个文件相当于自动汇总所有模型,方便引入

使用模型

const Sequelize = require('sequelize')
const initModels = require('./models/init-models')  //引入自动加载模块


const database = new Sequelize('koa', 'root', 'password', {
    host: '127.0.0.1',      //host地址
    port: '3306',           //
    dialect: 'mysql' //指定连接的数据库类型
})

database.authenticate().then(() => {
    console.log('成功')     //数据库连接成功
}).catch(err => {
    console.log(err, '失败') //数据库连接失败
})

const model = initModels(database) //把实例化的数据库对象放到自动加载模块中

这个时候使用就是
model.user.findAll().then(res =>  { console.log(res)}) //相当于所有的表格模型绑定到了model对象下面

 打印sql查询的日志

const sequelize = new Sequelize('sqlite::memory:', {
  // 选择一种日志记录参数
  logging: console.log,                  // 默认值,显示日志函数调用的第一个参数
  logging: (...msg) => console.log(msg), // 显示所有日志函数调用参数
  logging: false,                        // 禁用日志记录
  logging: msg => logger.debug(msg),     // 使用自定义记录器(例如Winston 或 Bunyan),显示第一个参数
  logging: logger.debug.bind(logger)     // 使用自定义记录器的另一种方法,显示所有消息
});

 

 sequelize的使用具体见   sequelize官网

 

posted on 2021-03-03 12:46  even_blogs  阅读(205)  评论(0编辑  收藏  举报