【问题标题】:Node.js: Are Global Vars shared between instances?Node.js:全局变量是否在实例之间共享?
【发布时间】:2019-07-01 19:25:04
【问题描述】:

我有这个代码:

app.post('/pst', function(req, res) {
        var url = req.body.convo;


                myAsyncFucntion(url).then(result => { 
                    console.log('TAKE A LOOK AT THIS!');


                    //transforming array to string to pass to Buffer.from()
                    //then we remove ',' with newlines, so each index of array is a new line
                    var str = result.toString();
                    result = str.split(',').join('\r\n');


                    //clever way to send text file to client from the memory of the server
                    var fileContents = Buffer.from(result, 'ascii');
                    var readStream = new stream.PassThrough();
                    readStream.end(fileContents);
                    res.set('Content-disposition', 'attachment; filename=' + fileName);
                    res.set('Content-Type', 'text/plain');
                    readStream.pipe(res);

                    //garbage collecting. i don't know if it's neccessary
                    result = '';
                    str = '';

                }).catch(err => {
                    console.log(err);
                    res.render('error.ejs');
                })
});

此代码将运行一个异步函数,并以文本文件的形式从内存中为用户提供一些数据。 我计划使用套接字并通知客户工作已完成。 客户端将输入一个链接并下载一个文件。

所以我计划获取局部变量结果并将其导出到全局变量中。 这样,app.get() 将可以访问它,当用户点击该链接时,它将提供该文件。

但一位用户告诉我,全局变量是在实例之间共享的。

这是真的吗?所以如果两个(或更多)用户试图同时得到他们的结果,全局变量将是相同的

他们两个?

【问题讨论】:

  • “实例”是什么意思?
  • 我认为他的意思是节点服务的运行实例。但是,接下来的问题是:不同的用户可能会访问一个用户私有的数据(?)
  • 例如,两个用户访问网络应用,将是两个实例。
  • @user1584421 是的,只有一个运行时可以同时处理两个请求,并且它们将共享一个全局变量。您需要为不同的用户创建不同的资源 - 例如存储在全局 Map
  • @user1584421 请注意,如果每个请求都有自己的全局变量,那么您的方法将无法正常工作 - /pst 调用会创建一个值,但随后会单独请求从链接下载文件如果它再次拥有自己的全局变量,则无法访问它。所以是的,您需要明确区分不同用户的(可能是并发的)请求。

标签: javascript node.js asynchronous async-await global-variables


【解决方案1】:

这是真的吗?

是的。 (嗯,实际上是的。真正的答案是首先没有“多个实例”:您有一个服务器,多个用户向其发出多个请求。)

如果您想将数据与特定浏览器会话相关联,请使用session(Express 存在用于处理会话的 NPM 模块)。

【讨论】:

    【解决方案2】:

    这实际上取决于您声明这些变量的位置。

    请阅读一些关于 JS 中“变量范围”的文档。

    当那里有大量文字和图片精美的解释时,很难在这里解释它。

    如果在为每个用户请求重新读取的代码区域内声明了某个变量,那么这个变量对于每个用户来说都是不同的。

    如果您在该部分之外声明变量,则该内容对于您的节点应用程序的每个操作都是相同的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      • 1970-01-01
      • 2019-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多