【问题标题】:Persistent variables in nodeJSnodeJS中的持久变量
【发布时间】:2026-02-05 17:35:01
【问题描述】:

我正在编写一个节点应用程序,它需要跨 createServer() 回调的连接迭代记住数据。有没有不涉及数据库或文件读/写的简单方法?到目前为止,我已经尝试在各个模块甚至主脚本中创建对象,同时将它们传递给各种响应处理程序,但是对于每个连接,它们都会被刷新。

我的意思是:

require('http').createServer(function(req,res){
        route(req,res,object);
}).listen(cp=80);

object={variable:0}

function route(req,res,object){
    res.end();
    console.log(object.variable);
    object.variable=Math.floor(Math.random()*100);
}

console.log 在这种情况下,每个连接都会抛出0。有没有办法创建全局变量,不是跨模块可用,而是持久性不像var's?

【问题讨论】:

    标签: javascript node.js


    【解决方案1】:

    Node 中的每个模块都有自己的作用域,所以不,var Foo; 不会创建全局变量 Foo。使用模块内部的global 对象。

    更新:

    require('http').createServer(function(req,res){
            route(req,res,object);
    }).listen(cp=8080);
    
    object={variable:0}
    global.foo = 'Bar'; // I added this
    
    function route(req,res,object){
        res.end();
        console.log(object.variable);
        console.log("foo = %s", global.foo); // I added this too
        object.variable=Math.floor(Math.random()*100);
    }
    

    它也会按预期记录“foo = Bar”。

    【讨论】:

    • 你是如何测试的?我刚刚在 Node 中运行了您的代码,它按预期工作。
    • 事实证明,我实际上有一个编程侥幸,我创建了对象(会话)并在其中包含了自毁超时。显然发生的事情是,对于计时器的值,我输入了一个显然无法解析的数学方程。结果,变量将在 318 毫秒内自毁。好玩的东西。另外值得注意的是,您不需要使用全局命名空间来工作;如果您恰好在要求中有回调,您也不需要在主模块内声明变量。非常感谢更新,再次感谢!
    • 在这种特殊情况下,不,您不需要全局。如果您使用 require() 异步加载模块,那么您在此处声明的内容(例如 app.js)将在模块中不可见。在那里你需要使用一个全局对象。