Node JS:模块之间的变量用法

时间:2017-06-05 03:50:57

标签: javascript node.js

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

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

在范围界定或异步编码方面我缺少什么?从逻辑上讲,我知道getName函数总是在前面运行,所以如何阅读' user'使用该预运行功能设置的其他模块中的变量?我最终希望用express扩展它并将其用作站点登录

4 个答案:

答案 0 :(得分:0)

试试这个

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

如果异步问题那么

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);
});

希望这有帮助。

答案 1 :(得分:0)

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

在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);

答案 2 :(得分:0)

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



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;




这假设您只有一个User实例。否则你可能想要导出整个函数并像这样使用它:



// exports createUser function instead
module.exports.createUser = createUser;


// in other files
var createUser = require('../path/createUser.js');

var bobby = createUser();
bobby.getName('bobby'); // will return 'bobby'

console.log(bobby.user); // will also return 'bobby'




答案 3 :(得分:0)

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

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

要让exports.user始终提供var user的值,一个选项是将前者定义为getter property,然后返回后者:

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

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

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