在 Node 中的文件之间共享变量.js?

2022-08-30 02:08:45

以下是2个文件:

// main.js
require('./module');
console.log(name); // prints "foobar"

// module.js
name = "foobar";

当我没有“var”时,它可以工作。但是当我有:

// module.js
var name = "foobar";

名称将在 main.js 中未定义。

我听说全局变量很糟糕,你最好在引用之前使用“var”。但这是全局变量好的情况吗?


答案 1

全局变量几乎从来都不是一件好事(也许是一两个例外......)。在这种情况下,看起来您真的只想导出“name”变量。例如,

// module.js
var name = "foobar";
// export it
exports.name = name;

然后,主要.js...

//main.js
// get a reference to your required module
var myModule = require('./module');

// name is a member of myModule due to the export above
var name = myModule.name;

答案 2

我无法找到全局变量是最佳选择的方案,当然你可以有一个,但是看看这些例子,你可能会找到一个更好的方法来完成同样的事情:var

方案 1:将内容放入配置文件中

您需要一些值,它在整个应用程序中是相同的,但它会根据环境(生产,开发或测试)而变化,例如邮件类型,您需要:

// File: config/environments/production.json
{
    "mailerType": "SMTP",
    "mailerConfig": {
      "service": "Gmail",
      ....
}

// File: config/environments/test.json
{
    "mailerType": "Stub",
    "mailerConfig": {
      "error": false
    }
}

(也为开发进行类似的配置)

要决定将加载哪个配置,请制作一个主配置文件(这将在整个应用程序中使用)

// File: config/config.js
var _ = require('underscore');

module.exports = _.extend(
    require(__dirname + '/../config/environments/' + process.env.NODE_ENV + '.json') || {});

现在,您可以像这样获取数据

// File: server.js
...
var config = require('./config/config');
...
mailer.setTransport(nodemailer.createTransport(config.mailerType, config.mailerConfig));

方案 2:使用常量文件

// File: constants.js
module.exports = {
  appName: 'My neat app',
  currentAPIVersion: 3
};

并以这种方式使用它

// File: config/routes.js

var constants = require('../constants');

module.exports = function(app, passport, auth) {
  var apiroot = '/api/v' + constants.currentAPIVersion;
...
  app.post(apiroot + '/users', users.create);
...

方案 3:使用帮助程序函数获取/设置数据

不是这个的忠实粉丝,但至少你可以跟踪“名称”的使用(引用OP的例子)并进行验证。

// File: helpers/nameHelper.js

var _name = 'I shall not be null'

exports.getName = function() {
  return _name;
};

exports.setName = function(name) {
  //validate the name...
  _name = name;
};

并使用它

// File: controllers/users.js

var nameHelper = require('../helpers/nameHelper.js');

exports.create = function(req, res, next) {
  var user = new User();
  user.name = req.body.name || nameHelper.getName();
  ...

当除了全局 ,没有其他解决方案时,可能会有一个用例,但是通常你可以使用这些方案之一在应用中共享数据,如果你开始使用node.js(就像我之前一样)尝试组织你处理数据的方式,因为它很快就会变得混乱。var