介绍

将用户的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
// ...
// session配置(加密密匙)
app.keys = ['XiaoKang666']
app.use(
session({
// cookie的name 默认是 koa.sid
key: 'weibo.sid',
// redis key 的前缀 默认是 koa.sess
prefix: 'weibo:sess:',
cookie: {
path: '/',
httpOnly: true,
maxAge: 24 * 60 * 60 * 1000
},
store: redisStore({
all: `${REDIS_CONF.host}:${REDIS_CONF.port}`
})
})
)
// routes
app.use(index.routes(), index.allowedMethods())
app.use(users.routes(), users.allowedMethods())

使用session时只需要为ctxsession操作即可。

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
})

image-20201216190042883

单元测试

单元测试使用jest

  • *.test.js文件
  • 常用的断言
  • 测试http接口

安装插件

1
yarn add --dev 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
/**
* @author 小康
* @description test demo
*/
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
/**
* @author 小康
* @description json test
*/

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. 忽略的文件

    1
    2
    3
    node_modules
    test
    src/public

    这些目录下的文件将忽略eslint语法检查

  2. 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即可检查。

image-20201216202106219

为了规范每次提交前运行命令进行代码检查,因此还需要插件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
/**
* @author 小康
* @description error 404路由
*/

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

// 错误页面
router.get('/error', async function () {
await ctx.render('error')
})
// 兜底 404
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)

// routes
app.use(index.routes(), index.allowedMethods())
app.use(users.routes(), users.allowedMethods())
app.use(errorViewRouter.routes(), errorViewRouter.allowedMethods())