先简单梳理一下web站 api站工作原理

1
2
3
4
5
6
7
8
9
10
11
12
13
st=>start: url输入
e=>end: 页面输出
st->op1->op2

op1=>operation: 匹配路由
op2=>operation: 经过中间件
op3=>operation: 经过过滤器
op5=>operation: 发送到api站
op6=>operation: 结果返回
op4=>operation: 渲染页面

st->op1->op2->op3->op4
op5->op6->e

目前的方案

  1. 初始化web站的时候,增加中间件,req.query.nowucme(now you see me的缩写)判断是否为预览接口模式,如果是true的话则开启
  2. 增加一个SORID(same-origin requese ID),SORID为一个UUID(全球唯一ID),传到API站点作为识别代码
  3. OOZ站点接收所有请求并保存在mongoDB
  4. 在渲染页面时注入一段js,开启websocket发送当前用户的GUID以及SORID
  5. OOZ站点新建一条路由接收ws发送的参数并查库,过滤后返回
  6. 页面接收到参数并显示在页面上
  7. 对数据精简,适当进行json格式化以及美化样式

涉及到的技术点

  • mongoDB基本增删改查语句
  • mongoDB的读写,schema和model的运用与理解
  • 服务端以及客户端websocket的建立以及传输

可以优化的点或者问题

  1. 因为页面发送的请求是异步的,不可控制的,所以现在在OOZ站点进行的是定时器查询,是否可以等到最后一次请求结束后,只查询一次数据库?
  2. 因为请求是以一个独立链接匹配路由的,所以SORID并不能由Referer继承,所以目前在express中是一个全局变量.
    1. 一次页面访问会生成一个新的SORID,覆盖上次的.
    2. 未加nowucme参数时访问的页面会带着上次的SORID,如果查询历史访问数据可能会出现很多
  3. 有些下单页面无法加入参数,有些页面获取不到请求

开会讨论后的结果

  1. 把SORID放在中间件里,直接渲染在同步页面
  2. 修改djutils.ajax,增加SORID参数
  3. 页面onLoad之后请求OOZ拿到数据并渲染

误区

  • 只需要上次页面的结果而不是需要当前页面的结果 而我关注的点是只关心当前页面数据,不去考虑历史
  • 参数+SORID直接查询结果
  • 通过head参数判断请求来自api还是web,如果是web则重新生成SORID