2014-10-29 67 views
0

我有一个节点顶层myapp变量,它包含一些关键的应用程序状态 - 记录器,db处理程序和一些其他数据。目录层次结构中的下游模块需要访问这些数据。我如何在节点中设置一个键/值系统来做到这一点?如何将共享变量传递给下游模块?

Express: How to pass app-instance to routes from a different file?高度upticked和接受的答案建议使用,在一个较低的水平模块

//in routes/index.js 
var app = require("../app"); 

但这注入的目录结构和文件名的硬编码的知识,这应该是一个更大无 - 没有jimho。有没有其他方法,比如JavaScript中的本地特性?我也不喜欢在没有var的情况下声明变量的想法。

在较低范围内创建的对象可用值的节点方式是什么? (我对节点非常陌生,所有东西节点对我来说都不是很明显)

非常感谢。

+1

为了这个目的,我使用了global(参见http://nodejs.org/api/globals.html#globals_global),但我对任何好的选择感兴趣。 – user949300 2014-10-29 01:18:25

回答

1

由于使用节点全球(docs here)似乎是使用OP解决方案,以为我会添加它作为一个正式答复收集我有价值的点。

我强烈建议你命名空间的变量,所以像

global.myApp.logger = { info here } 
global.myApp.db = { 
    url: 'mongodb://localhost:27017/test', 
    connectOptions : {} 
} 

如果您在app.js只想允许它访问

global.myApp = this; 

像往常一样,用全局小心......

1

这并不真正与节点有关,而是与通用的软件体系结构决策相关。

当你有一个客户端和一个服务器模块/包/类(以他喜欢的方式调用它们)时,一种方法是定义服务器模块上的例程,该例程需要作为参数,无论您的客户端保留在“全局”范围,完成任务并将结果报告给客户。

这样,它就完全分离了,并且你对数据到哪里有严格的控制。

希望这有助于:)

+0

你说得对。但是我试图避免像'func(handle,...)'这样的签名,因为那时候句柄必须在任何地方都被拖拽。 – Dinesh 2014-10-29 01:02:11

0

一种方式做,这是一个匿名函数 - 而不是返回与module.exportsobject即返回function返回一个适当的值。

因此,假设我们想要将var1传递给我们的两个模块,即./module1.js./module2.js。这是模块的代码是什么样子:

module.exports = function(var1) { 
    return { 
     doSomething: function() { return var1; } 
    }; 
} 

然后,我们可以调用它像这样:

var downstream = require('./module1')('This is var1'); 

给你你想要什么。

+0

这是有效的,所以我继续我的工作谢谢。但是,如果我重组我的代码,现在它是./x/module1.js和./module2.js,那么我是否需要更改任何代码?我发现我必须这样做,但有没有解决方法? – Dinesh 2014-10-29 00:54:58

+0

@Dinesh,除非你想动态地加载一个模块(即你不知道它在哪里),你只需要改变require()中的字符串。如果你想动态地找到它,那就完全不同了。不要忘记标记答案接受:) – 2014-10-29 01:14:27

+0

。@布伦丹我做的。我遍历一个特定的目录,找到匹配某个模式的文件,实例化模块,询问它们可以处理的HTTP请求类型,并配置两个Web服务器之一。我正在考虑让模块加载并注册它们各自的功能。 – Dinesh 2014-10-29 02:40:55

0

我刚刚创建一个空的模块,并在node_modules安装它作为appglobals.js

// index.js 
module.exports = {}; 
// package.json too is barebones 
{ "name": "appGlobals" } 

然后围绕支柱它没有在未来担心重构:

var g = require("appglobals"); 
g.foo = "bar"; 

我希望它来建作为setter/getter,但灵活性必须受到赞赏。

(现在我只需要弄清楚如何将它打包用于生产)

+1

我也用过这样的一段时间,但最终更改为使用http://nodejs.org/api/globals.html#globals_global'global',因为它看起来稍微更干净和简单。 – user949300 2014-10-29 01:19:55

+0

那岩石!谢谢。告别我的虚拟模块。 – Dinesh 2014-10-29 01:38:10