节点JS:模块之间的variables使用

我有两个模块来表示我的问题/困惑:

f2.js:

var user; var getName = function(userName) { user = userName; return user; }; module.exports.getName = getName; module.exports.user = user; 

f1.js:

 var userName = require('./f2.js'); console.log(userName.getName("myName")); // I need below to return "myName" too - how? console.log(userName.user); 

当我运行f1.js时,我得到这些:

 myName undefined 

我在范围界定或asynchronous编码方面缺less什么? 从逻辑上讲,我知道getName函数将始终在前面运行,所以如何通过该预运行函数设置其他模块中的“user”variables? 我最终希望用express来扩展它,并将其用作网站login

       

网上收集的解决方案 "节点JS:模块之间的variables使用"

您可以将名称附加到用户function的实例中,如下所示:

 function createUser() { this.name = ''; return { user : this.user, getName: function(userName) { this.user = userName; return this.user; }, } } var newUser = createUser(); module.exports.getName = newUser.getName; module.exports.user = newUser.user; 

这是一个解决方法。 它会让你find你想要的东西,但这并不令人满意。

在f2.js中:

 var getName = function(userName, user) { user = userName; return user; }; module.exports.getName = getName; 

在f1.js中:

 var userName = require('./f2.js'); var user; console.log(userName.getName("myName", user)); console.log(user); 

问题是exports.uservar user是独立的副本。 最初,他们保持相同的价值,但变化不会影响另一个,类似于其他variables:

 var foo = 'one'; var bar = foo; // copies the value bar = 'two'; console.log(foo, bar); // "one" "two" 

为了使exports.user总是提供var user的值,一个选项是将前者定义为getter属性 ,返回后者:

 Object.defineProperty(module.exports, 'user', { get: function () { return user; } }); 

或者,直接将其分配给函数,但其​​他模块需要调用它:

 module.exports.user = function () { return user; }; 
 var userName = require('./f2.js'); // ... console.log(userName.user()); 

尝试这个

 userName.getName(username){ console.log(username); }); 

如果asynchronous的问题呢

f2.js

 var user; var getName = function(userName,callback) { user = userName; callback(user); }; module.exports.getName = getName; module.exports.user = user; 

f1.js

 var userName = require('./f2.js'); userName.getName(username, function(uname) { console.log(uname); }); 

希望这可以帮助。