账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    nodejs 为每一个请求隔离global的问题
    46
    0

    问题描述:

    现在的业务是这样的,node服务端每当一个请求进来的时候,会连续执行一系列函数(有同步有异步),并且其中的一部分函数会把一部分需要用到的cache直接挂在global上面,后继函数有些会用到global上面的变量,最终的render函数(返回给客户端响应 json或者html页面)也会用到global上面的变量(当然这个时候也会销毁变量)。

    所以现在问题来了,nodejs并不是一个请求一个请求的处理的,而是先处理同步的内容,在有多个请求访问的时候,前面的请求还没有处理完,后面的请求就开始处理了,这样就会污染global上面的变量,导致前面的请求获得的结果不正确,还会有内存泄漏的隐患。

    我知道直接把变量挂在global上面并不是一个最佳实践,但这里涉及到一些历史遗留问题,而且改的话也没有特别好的办法去解决(如果采用事件机制的话也会有类似问题)

    所以现在想解决这个问题...

    我的想法是,对于每一个请求来说最好有一个独立纯净的global对象,可以互不干扰,并且结束后自动销毁

    我试过采用vm模块的沙箱机制,但是这样会有两个问题:

    1.如果把整个服务端服务放在一个隔离环境中,和不放没什么区别,该有的问题还是会有。

    2.如果把关键模块放在隔离环境中(使用vm.runInNewContext),那么就无法在global上挂变量,后继函数也就无法获取到。

    最好的办法当然是把所有会往global上面挂变量的部分放在一个隔离环境中,但是由于涉及到的模块复杂,会有一系列的问题。

    所以我想知道,有没有什么别的办法可以做到对于每一个请求来说最好有一个独立纯净的global对象,可以互不干扰,并且结束后自动销毁, 或者有什么其他的方式可以解决上述困惑?

    恳请赐教。

    2
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • 壹廂情願° 普通会员 1楼

      在Node.js中,我们可以使用http.request模块来为每个请求隔离全局问题。http.request模块是Node.js内置的一个HTTP客户端库,它提供了在服务器端发送HTTP请求的方法。

      下面是一个简单的示例,展示了如何使用http.request模块为每个请求隔离全局问题:

      ```javascript const http = require('http');

      const hostname = 'localhost'; const port = 8080;

      const options = { hostname, port, path: '/api', method: 'GET', headers: { 'Accept': 'application/json' } };

      const req = http.request(options, (res) => { console.log(statusCode: ${res.statusCode}); res.on('data', (chunk) => { console.log(chunk); }); });

      req.on('error', (error) => { console.error(error: ${error.message}); });

      req.end(); ```

      在这个示例中,我们首先导入了http模块,然后定义了服务器的域名、端口和请求的路径。然后,我们使用http.request方法创建了一个新的HTTP请求,并设置了一些请求参数,包括请求的头部和请求的方法。

      在请求开始时,我们打印出请求的状态码和请求的数据。如果请求失败,我们打印出错误的信息。

      最后,我们使用req.end方法来结束请求。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部