介绍
将用户的session存放在redis中。
安装依赖
1
| yarn add koa-redis koa-generic-session
|
配置session
配置session需要在注册路由前进行配置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
app.keys = ['XiaoKang666'] app.use( session({ key: 'weibo.sid', prefix: 'weibo:sess:', cookie: { path: '/', httpOnly: true, maxAge: 24 * 60 * 60 * 1000 }, store: redisStore({ all: `${REDIS_CONF.host}:${REDIS_CONF.port}` }) }) )
app.use(index.routes(), index.allowedMethods()) app.use(users.routes(), users.allowedMethods())
|
使用session时只需要为ctx
的session
操作即可。
1 2 3 4 5 6 7 8
| router.get('/json', async (ctx, next) => { const session = ctx.session if (session.viewNum == null) { session.viewNum = 0 } session.viewNum++ ctx.body = 'session.viewNum:' + session.viewNum })
|
单元测试
单元测试使用jest
,
安装插件
修改package.json
的运行脚本
1 2 3 4 5 6
| "scripts": { "start": "node bin/www", "dev": "cross-env NODE_ENV=dev ./node_modules/.bin/nodemon bin/www", "prd": "cross-env NODE_ENV=production pm2 start bin/www", "test": "cross-env NODE_ENV=test jest --runInBand --forceExit --colors" }
|
测试函数
1 2 3 4 5 6 7 8 9 10 11 12
|
function sum(a, b) { return a + b }
test('10+20=30?', function () { const res = sum(10, 20) expect(res).toBe(30) })
|
测试http请求
1 2 3 4 5 6 7 8 9 10 11 12 13
|
const server = require('./server')
test('json接口返回数据格式正确', async () => { const res = await server.get('/json') expect(res.body).toEqual({ title: 'koa2 json' }) })
|
开发环境搭建
eslint
安装插件
1
| yarn add --dev eslint babel-eslint
|
编写配置文件
忽略的文件
1 2 3
| node_modules test src/public
|
这些目录下的文件将忽略eslint语法检查
eslint规则
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| { "parser": "babel-eslint", "env": { "es6": true, "commonjs": true, "node": true }, "rules": { "indent": ["error", 2], "quotes": [ "error", "single", { "allowTemplateLiterals": true } ], "semi": ["error", "never"] } }
|
修改package.json
脚本
1 2 3 4 5 6 7
| "scripts": { "start": "node bin/www", "dev": "cross-env NODE_ENV=dev ./node_modules/.bin/nodemon bin/www", "prd": "cross-env NODE_ENV=production pm2 start bin/www", "lint": "eslint --ext .js ./src", "test": "cross-env NODE_ENV=test jest --runInBand --forceExit --colors" }
|
此时运行yarn lint
即可检查。
为了规范每次提交前运行命令进行代码检查,因此还需要插件pre-commit
1
| yarn add --dev pre-commit
|
修改package.json
脚本
1 2 3
| { "pre-commit":["lint"] }
|
debug
修改运行脚本
1 2 3
| "scripts": { "dev": "cross-env NODE_ENV=dev ./node_modules/.bin/nodemon --inspect=9229 bin/www", },
|
通过访问chrome://inspect/
即可看到。
404、错误页面
路由配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
const router = require('koa-router')()
router.get('/error', async function () { await ctx.render('error') })
router.get('*', async function (ctx) { await ctx.render('404') })
module.exports = router
|
注册路由时应该将这个路由放到最后。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| const index = require('./routes/index') const users = require('./routes/users') const errorViewRouter = require('./routes/view/error')
const { isProd } = require('./utils/env')
let onErrorConfig = {} if (isProd) { onErrorConfig.redirect = '/error' } onerror(app, onErrorConfig)
app.use(index.routes(), index.allowedMethods()) app.use(users.routes(), users.allowedMethods()) app.use(errorViewRouter.routes(), errorViewRouter.allowedMethods())
|