redis
- 内存数据库(mysql是硬盘数据库)
- redis相关基础知识(安装、使用、node链接redis)可参考这篇博客
nodejs操作redis
- 进入weibo项目中,安装redis:
npm i redis --save --registry=https://registry.npm.taobao.org
- 获取全局环境参数,src下新建utils-env.js:
- 配置数据库(包括redis、mysql)的连接信息:在src下新建conf-db.js:根据全局环境参数来配置线上和线下的链接信息(现在先都用线下的来模拟)
- 连接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
}
- 注意:
- set()的参数3是数据有效时间(秒),过时即数据无效,到达指定时间后redis将自动清除数据
- 定义函数后在函数顶部输入jsDoc注释:写上注释的函数在被调用时鼠标移上去就会出现提示
- set()的参数1、2都是字符串格式的,所以使用set()时需要判断参数2是否为引用类型,如果参数是引用类型就要先使用
JSON.stringify()
将其转换为字符串类型的数组/对象,否则会自动使用toString()
方法进行转换,那结果会很麻烦。 - redis客户端的expire()用于处理过期数据
- get请求需要node向redis请求后获取一个redis返回的值,这是IO操作,而在node中IO操作是异步的。所以需要使用Promise对象对获取数据的过程进行封装。
- 由于之前存储数据时我们将对象转为JSON字符串了,所以输出数据时要先尝试将JSON字符串转回为JSON对象,而非JSON字符串则直接输出即可。同时要注意获取的值不存在时就返回空对象。
登录-cookie和session
- cookie和session的基础知识 可参考笔记博客项目登录(cookie)、博客项目登录(session、redis)
- cookie通过http请求头部传递到server端,server端根据cookie中的userId取出session中对应的信息用来判断用于是否登录
- session需要存储到redis中:从 session 到 redis
koa2使用session
- 可参考koa2重构博客项目
- 安装插件koa-generic-session和koa-redis(koa-redis是基于redis的,所以必须安装redis):
npm i koa-generic-session koa-redis redis --save
- koa-redis是koa连接redis的一种方式,koa-generic-session是koa生成session的一个工具
- app.js中,引入2个插件并配置:
- 在注册路由之前就需要配置session
- 注册session中间件时进行配置session并利用koa-redis将session存储到redis中
- 使用koa-redis时进行配置的信息从conf-db.js中获取
- 测试:在routes-index.js中获取并使用session来统计访问次数,在redis的cmd中看是否存储成功:注意:不使用session的情况下光是注册session则不会自动生成cookie/往redis中存储session
- 流程:用户每次访问网页时就会创建一个 ‘weibo.sid’前缀的cookie,值是’weibo:sess:’前缀的session名
- cookie对象的属性值是存储在redis中的session对象的对象名
- 然后服务端会有一系列操作往session中存储用户名和密码等,那么下次用户再访问网页时,服务端就可通过用户请求中的cookie值到redis中去获取session对象,进行判断:
- 流程:用户每次访问网页时就会创建一个 ‘weibo.sid’前缀的cookie,值是’weibo:sess:’前缀的session名
jest 单元测试
- 单个功能或接口,给定输入,得到输出。看输出是否符合要求
- 需手动编写用例代码,然后统一执行
- 执行意义:能一次性执行所有单测,短时间内验证所有功能是否正常
- 注意:必须是
.text.js
后缀的文件
jest的基本使用
- weibo项目下,(开发环境下)安装jest:
npm i jest --save-dev
- 在package.json中,设置test命令:
- 根目录下新建test文件夹,存放测试用例,新建demo.test.js: 注意:必须是
.text.js
后缀的文件
常用的断言
- 判断数字/字符串:a是b:
expect(数字/字符串a).toBe(数字/字符串b)
- 判断数字/字符串:a不是b
expect(数字/字符串a).not.toBe(数字/字符串b)
- 判断对象:a是b:
expect(对象a).toEqual(对象b)
测试http请求
- 安装supertest插件:
npm i supertest --save-dev
supertest插件用于模拟http请求 - 测试get请求:test文件夹下新建server.js来模拟http请求,新建json.test.js用于测试http请求:
- 运行dev再运行test:
- 测试post请求: