redis、session与jest基本使用方法

redis

  • 内存数据库(mysql是硬盘数据库)
  • redis相关基础知识(安装、使用、node链接redis)可参考这篇博客

nodejs操作redis

  1. 进入weibo项目中,安装redisnpm i redis --save --registry=https://registry.npm.taobao.org
  2. 获取全局环境参数,src下新建utils-env.jsutils-env.js
  3. 配置数据库(包括redis、mysql)的连接信息:在src下新建conf-db.jsconf-db.js根据全局环境参数来配置线上和线下的链接信息(现在先都用线下的来模拟)
  4. 连接redis并提供对redis中数据的读取方法(get/set),在src下新建cache-_redis.js_的意思:该文件是内部文件,不对外公开):
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    /**
    * @description 链接redis,提供读取redis数据的方法(get set)
    * @author hlz
    */

    const redis = require('redis')
    const { REDIS_CONF } = require('../conf/db')

    // 创建客户端
    const redisClient = redis.createClient(REDIS_CONF.port, REDIS_CONF.host)
    redisClient.on('error', err => {
    console.log('redis error', err)
    })

    /**
    * redis set方法
    * @param {string} key 键
    * @param {string} val 值
    * @param {number} timeout 过期时间,单位s
    */
    function set(key, val, timeout = 60 * 60) {
    if (typeof val === 'object') {
    val = JSON.stringify(val)
    }
    redisClient.set(key, val)
    redisClient.expire(key, timeout) // 处理过期数据
    }

    /**
    * redis get方法
    * @param {string} key 键
    */
    function get(key) {
    const promise = new Promise((resolve, reject) => {
    redisClient.get(key, (err, val) => {
    if (err) {
    console.error(err)
    return
    }
    if (val === null) {
    resolve(null)
    return
    }
    try {
    resolve(JSON.parse(val))
    } catch (ex) {
    resolve(val)
    }
    })
    })
    return promise
    }

    module.exports = {
    set,
    get
    }
  • 注意
    1. set()参数3数据有效时间(秒),过时即数据无效,到达指定时间后redis将自动清除数据
    2. 定义函数后在函数顶部输入jsDoc注释函数的jsDoc注释写上注释的函数在被调用时鼠标移上去就会出现提示
    3. set()的参数1、2都是字符串格式的,所以使用set()时需要判断参数2是否为引用类型,如果参数是引用类型就要先使用JSON.stringify()将其转换为字符串类型的数组/对象,否则会自动使用toString()方法进行转换,那结果会很麻烦。
    4. redis客户端的expire()用于处理过期数据
    5. get请求需要node向redis请求后获取一个redis返回的值,这是IO操作,而在node中IO操作是异步的。所以需要使用Promise对象对获取数据的过程进行封装
    6. 由于之前存储数据时我们将对象转为JSON字符串了,所以输出数据时要先尝试将JSON字符串转回为JSON对象,而非JSON字符串则直接输出即可。同时要注意获取的值不存在时就返回空对象。

登录-cookie和session

koa2使用session

  1. 安装插件koa-generic-session和koa-redis(koa-redis是基于redis的,所以必须安装redis):npm i koa-generic-session koa-redis redis --save
    • koa-rediskoa连接redis的一种方式koa-generic-sessionkoa生成session的一个工具
  2. app.js中,引入2个插件并配置app.js
    • 注册路由之前就需要配置session
    • 注册session中间件时进行配置session利用koa-redis将session存储到redis中
      • 使用koa-redis时进行配置的信息conf-db.js中获取
  3. 测试:在routes-index.js中获取并使用session来统计访问次数,在redis的cmd中看是否存储成功:routes-index.js注意:不使用session的情况下光是注册session则不会自动生成cookie/往redis中存储session访问8次后查看redis
    • 流程:用户每次访问网页时就会创建一个 ‘weibo.sid’前缀的cookie,值是’weibo:sess:’前缀的session名
      • cookie对象的属性值是存储在redis中的session对象的对象名
    • 然后服务端会有一系列操作往session中存储用户名和密码等,那么下次用户再访问网页时,服务端就可通过用户请求中的cookie值到redis中去获取session对象,进行判断:示意图

jest 单元测试

  • 单个功能或接口,给定输入,得到输出。看输出是否符合要求
  • 需手动编写用例代码,然后统一执行
  • 执行意义:能一次性执行所有单测,短时间内验证所有功能是否正常
  • 注意:必须是.text.js后缀的文件

jest的基本使用

  1. weibo项目下,(开发环境下)安装jestnpm i jest --save-dev
  2. 在package.json中,设置test命令package.json
  3. 根目录下新建test文件夹,存放测试用例,新建demo.test.jsdemo.test.js 注意:必须是.text.js后缀的文件

常用的断言

  1. 判断数字/字符串:a是bexpect(数字/字符串a).toBe(数字/字符串b)
  2. 判断数字/字符串:a不是bexpect(数字/字符串a).not.toBe(数字/字符串b)
  3. 判断对象:a是bexpect(对象a).toEqual(对象b)

测试http请求

  1. 安装supertest插件npm i supertest --save-devsupertest插件用于模拟http请求
  2. 测试get请求:test文件夹下新建server.js来模拟http请求,新建json.test.js用于测试http请求server.js、json.test.js测试的json路由
  3. 运行dev再运行test
  4. 测试post请求:json.test.js

,