【问题标题】:creating a global object in nodejs accessible by .js modules在 nodejs 中创建一个可由 .js 模块访问的全局对象
【发布时间】:2017-02-14 13:12:44
【问题描述】:

我的 nodejs 项目需要由不同的 .js 模块访问的内存表。一些模块会更新表,但所有模块的数据必须相同(类似于内存数据库)。因此,我需要一个真正的全局对象……而不是每个模块对象的全局对象。创建一个包含所有对象的 common.js 文件,然后在所有模块中 require 它是行不通的,因为数据将是各个模块的全局/本地数据。我已经看到对 nodejs globals 的引用,其中 global.myobject 对所有模块都是全局的,但文档并不清楚这是否如此。我看到的最后一次讨论是从 2014 年开始的。谁能告诉我目前的情况是什么?这个问题是如何解决的?

【问题讨论】:

  • 拥有一个 common.js 并导出一个对象文字,对于所有需要它的模块来说都是全局的。
  • 实际上,需要来自其他模块的相同common.js做到。每个模块只实例化一次,不管它需要多久。这正是您所需要的 - 单身人士。
  • @Bergi 2011 年的一个有点类似的问题stackoverflow.com/questions/8555792/creating-a-global-object 建议使用单例,但也建议不要这样做。你能证明这是如何工作的以及利弊吗?
  • @Keith 你是说通过要求 common.js 对其对象所做的更改将反映在下一个需要它的模块中吗?我不确定。你能指出一些支持这一点的文档吗?
  • @MichaelE 这是一个 C# 问题,在这里并不适用。是的,singleton 通常是个坏主意,因为它是全局状态,但这正是您所要求的。做一个模块,导出一个对象,就这么简单。

标签: javascript node.js


【解决方案1】:

在 node.js..

如果你有一个名为 common.js 的模块,看起来像这样..

'use strict';

var obj = {};
module.exports = obj;

然后在另一个模块中你这样做了

'use strict';
var c = require('./common');
c.test = 1234;

后来另一个模块做了这个..

'use strict';
var c = require('./common');
console.log(c);
//output = { test: 1234 }

modejs 中的模块,只是另一个对象。 nodejs,缓存任何需求,因此将始终返回相同的对象。

windows 用户的一个问题是,windows 文件名不区分大小写,所以如果你先使用 require('Common'),然后再使用 require('common');您将拥有相同模块的 2 个版本。这是将所有模块名称保持为小写的一个很好的理由。

【讨论】:

  • 感谢您提供的示例...stackoverflow.com/questions/4140661/… 中的 cmets 与 global.myobject 您是否有任何有关此替代的 cmets
  • global.myobject 的问题在于范围。使用 common.js 文件的优点是它是一个全局的,范围仅限于你的模块。如果由于某种原因有其他第三方库想要共享信息,那么可以使用 global.myobject。 IOW:全局有点像浏览器的窗口对象。
猜你喜欢
  • 2013-05-30
  • 2012-01-16
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 2013-03-16
  • 1970-01-01
相关资源
最近更新 更多