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对象都是该对象下的子对象
-
- use(callback)
-
- callback(context, next)
- context 对象 每一次请求都会包装一个context对象
- next 每一个中间件都是一个迭代器
- 异步中间件
use(async callback) -
- 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官网