节点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
您可以将名称附加到用户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.user
和var 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); });
希望这可以帮助。