2016-05-16 62 views
0

我用下面的代码节点的应用程序(我把代码结构的样品)模块出口approches

此代码在server.js这是切入点nodeModule

function run() { 
    app.listen(3001, function() { 
     console.log("App is listenting on port 3000"); 
    }) 
} 

function addPath(args) { 
    plug.loadF(args.loadFolder); 
}; 

function preProcess (args) { 

    if (_.isEmpty(args)) { 
     run(); 
    } 
}; 

module.exports = preProcess(); 
module.exports ={ 
    run: run, 
    addPath: addPath 
} 

正如你可以看到出口的两倍,在这种方式,我支持时,应用程序/模块从CMD叫两个选项(来电server.js)和是与下node_modules

  1. 使用代码依赖于module.exports = preProcess(); module.exports = preProcess();是,如果我的应用程序/ nodeModule从像java/buildpack外部程序调用呼叫和无参数传递

  2. 出口runaddPath这是如果我的模块在用户应用程序中安装为node_moudule并且您想通过代码调用这些API

我的问题是有更好的方法在节点上写那些出口或者如果没关系?

回答

1

您必须了解节点中提供的exports模块。

module.exports对象由Module系统创建。有时候 这是不可接受的;许多人希望他们的模块成为某个类的实例。为此,请将所需的导出对象分配给 module.exports。请注意,将期望的对象分配给导出将 简单地重新绑定本地导出变量,这可能不是您想要执行的操作 。

https://nodejs.org/api/modules.html#modules_module_exports

深入浅出的出口模块让你在一个文件中,使得它可以在另一个文件中重复使用环绕整个代码的功能。

因此,显然一个文件只能导出一个对象。

在你上面的代码因而你需要封装你的方法到一个对象:

var server = {} 
server.run = function() { 
    app.listen(3001, function() { 
     console.log("App is listenting on port 3000"); 
    }) 
} 

server.addPath = function addPath(args) { 
    plug.loadF(args.loadFolder); 
}; 

server.preProcess = function (args) { 

    if (_.isEmpty(args)) { 
     run(); 
    } 
}; 

module.exports = server 

现在,任何其他的页面,您可以简单地做:

var server = require ("../../path/to/server.js") 
server.preProcess() // Call to preprocess function 
server.addPath() // Call to addPath function 
server.run() // Call to run function 

基本上我已经封装所有的方法整合到一个“服务器”对象中,然后导出该对象。

+0

在这种情况下,最好使用'exports'而不是新的局部变量'server'。 – alexmac

+0

使用问题。我喜欢让我的全局对象免于混乱。 –

+0

@SaleemAhmed - 感谢你的代码,当你以代码的形式调用代码时,它会起作用,但如何在没有节点代码调用的情况下工作?如果其他程序通过CMD调用它并调用服务器。JS和它需要调用像运行服务器的过程...你可以请提供的例子,也应答module.exports = preProcess()? –