2012-01-27 48 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

相關問題