使用node做中间层的原因
我们公司原来的项目前端基于react框架webpack打包静态文件 + nginx静态服务和反向代理至java服务
使用中存在很多问题
遇到的问题
1. 唯一sessionID问题 起初服务端生成唯一sessionid ,请求并发问题导致sessionid被替换,改为客户端生成
2. 内存泄漏问题 node-heapdump
3. 文件缓存问题,静态文件使用koa-static 对于index.html 使用了文件缓存,当发布新的版本时会导致用户访问的还是旧版本文件,后来改用nginx作为静态资源管理,同时对html设置不缓存
-
唯一sessionId问题
我们设计的三方登录需要通过一个唯一键作为标识,最开始的时候我通过在node层,当用户访问时在用户当cookie中添加一个uuid来达到唯一标示的作用,存在并发请求造成标示被修改,从而前后标示不一致问题,最后通过在用户端加载时前端生成唯一ID来解决
这个问题其实主要是由于最初思路有误造成的
-
内存泄漏问题
在koa的回调函数中形成的闭包,导致koa context无法销毁,同时还造成请求出问题
module.exports = function(ctx) { // 最初在回调中挂载axios时动态执行interceptors,导致context无法销毁, // 同时这样会造成请求的interceptor一直在变,和实际的请求环境不同 // 有时候为了解决小问题造成的大问题 // axios.interceptors.request.use((config = {}) => { // const client = new Browser(ctx.request.header["user-agent"]); // let xClient; // switch (client.kernel) { // case "wx": // xClient = "btBaKQbd"; // break; // case "qq": // xClient = "OWsrWP3P"; // break; // case "wb": // xClient = "1cb6PvsH"; // break; // default: // xClient = "PYM7F7by"; // break; // } // // console.log("Log: config", config); // if (!config.headers["XSC-CLIENT"]) { // config.headers["XSC-CLIENT"] = xClient; // } // return { ...config }; // }); const reqInfo = { userAgent: ctx.request.header["user-agent"] }; ctx.post = post.bind(reqInfo); ctx.get = get.bind(reqInfo); // ctx.$ajax = axios; }; -
文件缓存问题
其实也不算问题,只是由于写的代码不够全面导致的,我们的系统使用的还是hash路由,所以在在代码里面写了对index.html缓存6小时的处理,但是没有考虑到上线html发生变化的问题,最后直接使用nginx的静态服务,这里也说说我的观点,很多人觉得能自己实现的功能都用自己的,但是能用和企业级的稳定不是说会就完事的,一个东西能经受很多产品的考验,必然是有出色的地方,想要代替的话,自己还是得要很大的功夫的
- 这次先写写遇到的一些大问题,后面的文章会对于node在我们项目中的作用,优劣等再分析分析