问题描述:
现在的业务是这样的,node服务端每当一个请求进来的时候,会连续执行一系列函数(有同步有异步),并且其中的一部分函数会把一部分需要用到的cache直接挂在global上面,后继函数有些会用到global上面的变量,最终的render函数(返回给客户端响应 json或者html页面)也会用到global上面的变量(当然这个时候也会销毁变量)。
所以现在问题来了,nodejs并不是一个请求一个请求的处理的,而是先处理同步的内容,在有多个请求访问的时候,前面的请求还没有处理完,后面的请求就开始处理了,这样就会污染global上面的变量,导致前面的请求获得的结果不正确,还会有内存泄漏的隐患。
我知道直接把变量挂在global上面并不是一个最佳实践,但这里涉及到一些历史遗留问题,而且改的话也没有特别好的办法去解决(如果采用事件机制的话也会有类似问题)
所以现在想解决这个问题...
我的想法是,对于每一个请求来说最好有一个独立纯净的global对象,可以互不干扰,并且结束后自动销毁。
我试过采用vm模块的沙箱机制,但是这样会有两个问题:
1.如果把整个服务端服务放在一个隔离环境中,和不放没什么区别,该有的问题还是会有。
2.如果把关键模块放在隔离环境中(使用vm.runInNewContext),那么就无法在global上挂变量,后继函数也就无法获取到。
最好的办法当然是把所有会往global上面挂变量的部分放在一个隔离环境中,但是由于涉及到的模块复杂,会有一系列的问题。
所以我想知道,有没有什么别的办法可以做到对于每一个请求来说最好有一个独立纯净的global对象,可以互不干扰,并且结束后自动销毁
, 或者有什么其他的方式可以解决上述困惑?
恳请赐教。
感觉你需要的是session,然而你又挂到global上...