nodejs 为每一个请求隔离global的问题
问题描述:
现在的业务是这样的,node服务端每当一个请求进来的时候,会连续执行一系列函数(有同步有异步),并且其中的一部分函数会把一部分需要用到的cache直接挂在global上面,后继函数有些会用到global上面的变量,最终的render函数(返回给客户端响应 json或者html页面)也会用到global上面的变量(当然这个时候也会销毁变量)。
所以现在问题来了,nodejs并不是一个请求一个请求的处理的,而是先处理同步的内容,在有多个请求访问的时候,前面的请求还没有处理完,后面的请求就开始处理了,这样就会污染global上面的变量,导致前面的请求获得的结果不正确,还会有内存泄漏的隐患。
我知道直接把变量挂在global上面并不是一个最佳实践,但这里涉及到一些历史遗留问题,而且改的话也没有特别好的办法去解决(如果采用事件机制的话也会有类似问题)
所以现在想解决这个问题...
我的想法是,对于每一个请求来说最好有一个独立纯净的global对象,可以互不干扰,并且结束后自动销毁。
我试过采用vm模块的沙箱机制,但是这样会有两个问题:
1.如果把整个服务端服务放在一个隔离环境中,和不放没什么区别,该有的问题还是会有。
2.如果把关键模块放在隔离环境中(使用vm.runInNewContext),那么就无法在global上挂变量,后继函数也就无法获取到。
最好的办法当然是把所有会往global上面挂变量的部分放在一个隔离环境中,但是由于涉及到的模块复杂,会有一系列的问题。
所以我想知道,有没有什么别的办法可以做到对于每一个请求来说最好有一个独立纯净的global对象,可以互不干扰,并且结束后自动销毁
, 或者有什么其他的方式可以解决上述困惑?
恳请赐教。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
感觉你需要的是session,然而你又挂到global上...
在每个 controller 处理函数里面,起一个变量比如叫 ctx,在后面的函数处理中,把这个 ctx 当做参数传递过去。
因为你说的需求里面,这个所谓的 global 对象是和每个请求的上下文关联的,且独立,那么不可能做成全局变量的,只可能放在 Controller 处理函数内部。
原生 http. createServer(function(req, res){}), 是有 req/res 对象的,也就是请求独立的上下文,可以挂载到 req 上。
如果用 koa 等框架,也可以挂载到 ctx 上,ctx 本身就是 req/res 的封装和扩展。
1、“前面的请求还没有处理完,后面的请求就开始处理了”,如果你需要的变量值是前面处理完之后的,那肯定是要进行异步流程控制的。
2、每一个 req 请求本身就是一个独立的对象,并且会在其整个生命周期中传递,你完全可以在 req 上自定义属性用来挂载你的数据。