Skip to content

Latest commit

 

History

History
170 lines (115 loc) · 4.99 KB

File metadata and controls

170 lines (115 loc) · 4.99 KB

MyHub项目实战

完整的项目一般有两套接口

  1. 面向用户的业务接口
  2. 面向企业或者内部的后台管理接口

###目录结构划分 一般按照功能模块划分/按照业务模块进行划分

本项目按照功能模块进行划分

将项目源文件夹src划分为

  1. app
  2. constants
  3. controller
  4. middleware
  5. router
  6. service
  7. utils
  8. index.js入口文件

业务逻辑:

src文件夹中的index中只负责让app监听端口号,

app文件夹中的index负责实例化app并且将中间件注册到app上

database:建立与数据库之间的链接 errorHandle:定义错误分类处理函数 config:调用dotenv包,将加入process.env中的变量导出

router文件夹中的user.router负责注册路由及配置接口

可以在router文件夹中添加一个index.js, 防止app文件夹index.js中路由注册过多的问题

controller文件夹中的user.controller负责router中的回调函数

controller负责定义路由最后中间件函数

middleware文件夹中负责中间件

middleware负责在最后一层中间件中插入具体验证中间件 包括用户名密码空白校验,用户名密码匹配,密码加密函数的封装

service文件夹中的user.service负责对数据库进行增删改查

app文件夹中的database负责引入mysql2并链接至数据库

需要对密码进行加密,使用node自带的crypto模块,模块内有createHash方法用来给密码进行加密

cookie和session cookie分为

  • 内存cookie:保存在内存中,没有设置过期时间,当关闭浏览器时会自动删除
  • 硬盘cookie:保存在硬盘中,一般设置过期时间,需要手动删除或者到期自动删除 cookie常见属性 expires:设置一个固定时间 max-age:设置一个倒计时(常用)

cookie有自己的作用域 Domain:默认属性为origin,指定哪些主机可以接受cookie Path:指定主机下哪些路径可以接受cookie

给浏览器设置cookie方式

  1. 客户端设置
  2. 服务器设置

使用ctx.cookies.set("name","zhen",{maxAge:3000}) 可以设置硬盘cookie,过期时间为3000ms

cookie和session的缺点:

  • cookie会被添加在每个http请求中,增加流量
  • cookie是平稳传输,存在安全隐患
  • cookie有4kb大小限制
  • 对于浏览器外的其他客户端,必须手动的设置cookie和session
  • 对于分布式系统和服务器集群,无法保证其他系统也正确解析session

Token

JWT(json web token)实现Token机制 JWT生成的Token由三个部分组成

  1. header
  • alg:采用的加密算法(默认为HS256)
  • typ:固定值一般为JWT
  1. payload
  • 将需要加密的键值对放置到文本中
  • 默认携带iat:令牌签发时间
  • exp:用来设置token过期时间
  1. signature
  • 通过设置一个secretKey,将前两个结果合并进行HS256加密 加密公式为: HS256(base64Url(header)+.+base64Url(payload),secretKey)

HS256加密算法是对称加密,加密和解密使用的是同一个钥匙 使用非对称加密可以生成私钥和公钥

使用openssl生成公钥和私钥

  1. 命令行输入openssl
  2. 输入genrsa -out private.key 1024 (生成1024大小的私钥并导出至private.key文件)
  3. 输入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过期会报错

####评论模块接口编写

  1. 表的设计:包含外键约束(userId,commentId,replyId),注意外键应设置on delete cascade
  2. 接口设置: 路由地址: /comment 发表评论:post请求 路由为"/" 需要的参数为:momentId(动态编号),content,userId 回复评论:post请求 路由为"/:commentId" 需要的参数为:momentId(动态编号),content,userId,commentId 修改评论:patch请求,路由为"/:commentId" 需要参数:commentId,content 删除评论:delete请求 路由为:"/:commentId" 需要参数commentId

comment数据表包含的字段有

  1. id :表的主键id
  2. content :表中的内容
  3. moment_id :评论的是哪一条动态
  4. user_id :谁发表的评论
  5. 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