使用Node.js中间层对旧系统升级的心得

304 阅读2分钟

使用node做中间层的原因

我们公司原来的项目前端基于react框架webpack打包静态文件 + nginx静态服务和反向代理至java服务
使用中存在很多问题

遇到的问题

1. 唯一sessionID问题  起初服务端生成唯一sessionid ,请求并发问题导致sessionid被替换,改为客户端生成
2. 内存泄漏问题 node-heapdump
3. 文件缓存问题,静态文件使用koa-static 对于index.html 使用了文件缓存,当发布新的版本时会导致用户访问的还是旧版本文件,后来改用nginx作为静态资源管理,同时对html设置不缓存
  1. 唯一sessionId问题

    我们设计的三方登录需要通过一个唯一键作为标识,最开始的时候我通过在node层,当用户访问时在用户当cookie中添加一个uuid来达到唯一标示的作用,存在并发请求造成标示被修改,从而前后标示不一致问题,最后通过在用户端加载时前端生成唯一ID来解决

    这个问题其实主要是由于最初思路有误造成的

  2. 内存泄漏问题

    在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;
    };
    
  3. 文件缓存问题

    其实也不算问题,只是由于写的代码不够全面导致的,我们的系统使用的还是hash路由,所以在在代码里面写了对index.html缓存6小时的处理,但是没有考虑到上线html发生变化的问题,最后直接使用nginx的静态服务,这里也说说我的观点,很多人觉得能自己实现的功能都用自己的,但是能用和企业级的稳定不是说会就完事的,一个东西能经受很多产品的考验,必然是有出色的地方,想要代替的话,自己还是得要很大的功夫的

  • 这次先写写遇到的一些大问题,后面的文章会对于node在我们项目中的作用,优劣等再分析分析