2012-01-27 19 views
3

比方说,我有以下app.js(显然非常简体):从node.js的模块中调用app.js的函数?

var express = require('express'), 
    app = express.createServer(); 

// include routes 
require('./lib/routes')(app); 

// some random function 
var foo = function() { 
    return 'bar'; 
}; 

// another random function 
var foo2 = function() { 
    return 'bar2'; 
}; 

然后,我有路由模块:

module.exports = function(app){ 
    app.get('/some/route', function(req, res){ 
     var fooBar = foo(), 
      fooBar2 = foo2(); 

     res.end(fooBar + fooBar2); 
    }); 
}; 

这显然因为富不工作, foo2没有在模块中定义。有没有办法使这项工作,或至少有不同的模式,以更好地完成这件事?

回答

6

那么你可以把这两个函数放在一个对象中,并将它们传递给routes.js的初始化。

var express = require('express'), 
    app = express.createServer(); 

// some random function 
var foo = function() { 
    return 'bar'; 
}; 

// another random function 
var foo2 = function() { 
    return 'bar2'; 
}; 

var fns = {foo : foo, foo2: foo2} 

// include routes 
require('./lib/routes')(app, fns); 

在路线:

module.exports = function(app, fns){ 
    app.get('/some/route', function(req, res){ 
     var fooBar = fns.foo(), 
      fooBar2 = fns.foo2(); 

     res.end(fooBar + fooBar2); 
    }); 
}; 

这是我会怎么做。你也可以将它们包含在应用程序对象中。除了在init函数中传递它们之外,还可以导出这两个函数并在routes.js中要求它们。

var express = require('express'), 
    app = express.createServer(); 

// some random function 
var foo = function() { 
    return 'bar'; 
}; 

// another random function 
var foo2 = function() { 
    return 'bar2'; 
}; 

module.exports = {foo : foo, foo2: foo2} 

// include routes 
require('./lib/routes')(app, fns); 

在路线:

module.exports = function(app){ 
    var fns = require('../app.js'); 
    app.get('/some/route', function(req, res){ 
     var fooBar = fns.foo(), 
      fooBar2 = fns.foo2(); 

     res.end(fooBar + fooBar2); 
    }); 
}; 

但我不喜欢它的主意,因为它使循环依赖。对他们没有任何好感。

+2

原始问题和这个被接受的答案都暗示'module.exports'是一个被调用的函数。不是。这是一个包含函数的对象。同样,问题和这个答案在定义的大括号之后有一个尾随的“)”。例如'module.exports = function(app){..})' - 一件事情永远不会执行。另一方面,它应该像'module.exports.myfunc = function(args){...}'或'module.exports = {myfunc1:function(){...},myfunc2:function(){。 ..}}';好吧,这是一个老问题,但为了新手,它需要澄清。 – unsynchronized 2014-06-13 06:20:47

+0

右大括号是一个错误。 'module.exports'可以设置为一个函数。它非正式地称为亚纲模式。一探究竟。 – 2014-06-13 08:41:39

+0

我意识到它可以设置为任何你喜欢的东西,包括一个随机数。这一切都取决于你是否想要遵循标准,或者只是剽窃,而不是关心是否有人想使用你的代码。毕竟你根本不用模块。整个观点是遵循一个惯例。如果你打算这样做,一个可接受的方式是导出一个名为substack的对象或函数,它可以做任何你想做的事情。 – unsynchronized 2014-06-13 10:08:30

相关问题