先简单梳理一下web站 api站工作原理
1 | st=>start: url输入 |
目前的方案
- 初始化web站的时候,增加中间件,req.query.nowucme
(now you see me的缩写)
判断是否为预览接口模式,如果是true的话则开启 - 增加一个SORID
(same-origin requese ID)
,SORID为一个UUID(全球唯一ID)
,传到API站点作为识别代码 - OOZ站点接收所有请求并保存在mongoDB
- 在渲染页面时注入一段js,开启websocket发送当前用户的GUID以及SORID
- OOZ站点新建一条路由接收ws发送的参数并查库,过滤后返回
- 页面接收到参数并显示在页面上
- 对数据精简,适当进行json格式化以及美化样式
涉及到的技术点
- mongoDB基本增删改查语句
- mongoDB的读写,schema和model的运用与理解
- 服务端以及客户端websocket的建立以及传输
可以优化的点或者问题
- 因为页面发送的请求是异步的,不可控制的,所以现在在OOZ站点进行的是定时器查询,是否可以等到最后一次请求结束后,只查询一次数据库?
- 因为请求是以一个独立链接匹配路由的,所以SORID并不能由Referer继承,所以目前在express中是一个全局变量.
- 一次页面访问会生成一个新的SORID,覆盖上次的.
- 未加nowucme参数时访问的页面会带着上次的SORID,如果查询历史访问数据可能会出现很多
- 有些下单页面无法加入参数,有些页面获取不到请求
开会讨论后的结果
- 把SORID放在中间件里,直接渲染在同步页面
- 修改djutils.ajax,增加SORID参数
- 页面onLoad之后请求OOZ拿到数据并渲染
误区
- 只需要上次页面的结果而不是需要当前页面的结果 而我关注的点是只关心当前页面数据,不去考虑历史
- 参数+SORID直接查询结果
- 通过head参数判断请求来自api还是web,如果是web则重新生成SORID