- 面向用户的业务接口
- 面向企业或者内部的后台管理接口
###目录结构划分 一般按照功能模块划分/按照业务模块进行划分
本项目按照功能模块进行划分
将项目源文件夹src划分为
- app
- constants
- controller
- middleware
- router
- service
- utils
- index.js入口文件
database:建立与数据库之间的链接 errorHandle:定义错误分类处理函数 config:调用dotenv包,将加入process.env中的变量导出
可以在router文件夹中添加一个index.js, 防止app文件夹index.js中路由注册过多的问题
controller负责定义路由最后中间件函数
middleware负责在最后一层中间件中插入具体验证中间件 包括用户名密码空白校验,用户名密码匹配,密码加密函数的封装
需要对密码进行加密,使用node自带的crypto模块,模块内有createHash方法用来给密码进行加密
cookie和session cookie分为
- 内存cookie:保存在内存中,没有设置过期时间,当关闭浏览器时会自动删除
- 硬盘cookie:保存在硬盘中,一般设置过期时间,需要手动删除或者到期自动删除 cookie常见属性 expires:设置一个固定时间 max-age:设置一个倒计时(常用)
cookie有自己的作用域 Domain:默认属性为origin,指定哪些主机可以接受cookie Path:指定主机下哪些路径可以接受cookie
给浏览器设置cookie方式
- 客户端设置
- 服务器设置
使用ctx.cookies.set("name","zhen",{maxAge:3000})
可以设置硬盘cookie,过期时间为3000ms
cookie和session的缺点:
- cookie会被添加在每个http请求中,增加流量
- cookie是平稳传输,存在安全隐患
- cookie有4kb大小限制
- 对于浏览器外的其他客户端,必须手动的设置cookie和session
- 对于分布式系统和服务器集群,无法保证其他系统也正确解析session
JWT(json web token)实现Token机制 JWT生成的Token由三个部分组成
- header
- alg:采用的加密算法(默认为HS256)
- typ:固定值一般为JWT
- payload
- 将需要加密的键值对放置到文本中
- 默认携带iat:令牌签发时间
- exp:用来设置token过期时间
- signature
- 通过设置一个secretKey,将前两个结果合并进行HS256加密 加密公式为: HS256(base64Url(header)+.+base64Url(payload),secretKey)
HS256加密算法是对称加密,加密和解密使用的是同一个钥匙 使用非对称加密可以生成私钥和公钥
使用openssl生成公钥和私钥
- 命令行输入openssl
- 输入genrsa -out private.key 1024 (生成1024大小的私钥并导出至private.key文件)
- 输入rsa -in private.key -pubout -out public.key (根据private.key中的私钥生成公钥并写入public.key文件)
jwt的使用
const jwt=require("jsonwebtoken")
//加密
const token=jwt.sign([加密对象],privateKey,{
expiresIn:10, //10s后过期
algorithm:"RS256" //使用加密算法为RS256
})
//将token加入请求头
//authorization=>Bearer
//解密
const auth=ctx.header.authorization
const token=auth.replace("Bearer ","")
jwt.verify([token],publicKey,{
algorithms:["RS256"] //注意此处algorithms为复数,值为数组
})
//使用jwt.verify需要进行try-catch否则jwt过期会报错####评论模块接口编写
- 表的设计:包含外键约束(userId,commentId,replyId),注意外键应设置on delete cascade
- 接口设置: 路由地址: /comment 发表评论:post请求 路由为"/" 需要的参数为:momentId(动态编号),content,userId 回复评论:post请求 路由为"/:commentId" 需要的参数为:momentId(动态编号),content,userId,commentId 修改评论:patch请求,路由为"/:commentId" 需要参数:commentId,content 删除评论:delete请求 路由为:"/:commentId" 需要参数commentId
comment数据表包含的字段有
- id :表的主键id
- content :表中的内容
- moment_id :评论的是哪一条动态
- user_id :谁发表的评论
- comment_id :回复的是哪条评论,默认值为null 上述moment_id,user_id,comment_id都需要绑定外键
####标签模块编写
通过子查询可以在查询中添加查询结果的字段 SELECT (SELECT COUNT(*) FROM comment c WHERE c.moment_id=moment.id) FROM moment LEFT JOIN user ON user.id=moment.user_id
、
####标签接口
给动态添加标签,post请求: moment/:momentId/labels 参数: labels