2012-10-13 201 views
3

我有一個模塊調用UserProvider看起來像這樣與node.js的嵌套模塊

var UserProvider = function(db) { ... } 
UserProvider.prototype.createUser = function(email, password, callback) { ... } 
UserProvider.prototype.findUserByEmail = function(email, callback) { ... } 
... 
exports.UserProvider = UserProvider; 

而另一個名爲ModelProvider模塊,看起來像這樣

var UserProvider = require('./user').UserProvider; 
var ModelProvider = function() { 
    ... 
    this.User = new UserProvider(db); 
} 
exports.ModelProvider = ModelProvider; 

但行this.User = new UserProvider(db);不允許我訪問包含ModelProvider模塊的主模塊中的UserProvider對象。

當我嘗試調用此:

var ModelProvider = require('./model/model').ModelProvider; 
var Model = new ModelProvider(); 

Model.User.findUserByEmail(email, function() {...}); 

它提供了以下錯誤:

TypeError: Object function Model(doc, fields, skipId) { 
    if (!(this instanceof Model)) 
     return new Model(doc, fields, skipId); 
    model.call(this, doc, fields, skipId); 
} has no method 'findUserByEmail' 

我假設有,我很想念揭露下來一些JavaScript掛羊頭賣狗肉?

謝謝!

+0

我認爲你需要要求主模塊中的用戶模塊,以及或者還加上' UserProvider'到模型模塊中的'exports'對象。 –

+0

正確,但實例化用戶模型的實例取決於數據庫連接對象,所以我希望Model模塊在其啓動時對其進行初始化,然後將其公開。 – grivescorbett

+0

因此假設你在你的主模塊中有類似'var model = new ModelProvider()'的東西,如果你訪問'model.User',你會得到什麼? –

回答

1

什麼出現在這種情況下要發生的事情,你的錯誤的原因是,Model.User其實不是的UserProvider一個實例,但似乎指向一個名爲Model定義爲功能...

function Model(doc, fields, skipId) { 
    if(!(this instanceof Model)) 
     return new Model(doc, fields, skipId); 
    model.call(this, doc, fields, skipId); 
} 

現在這種分配可以在你的代碼中的三個位置發生......

var Model = new ModelProvider(); 
// Here sets Model.User 
Model.User.findUserByEmail(...); 

或者......

function ModelProvider() { 
    ... 
    this.User = new UserProvider(db); 
    // Here sets this.User 
} 

或者......

function UserProvider(db) { 
    // Here as a return statement 
} 

我猜,後者可能在問題發生的事情。


要明確以下所有的都是可能的NodeJS ...

導入從一個模塊一個構造函數,並不一定包含它......要清楚你不該」 t可以做到這一點,但可以鏈接導出,以便模塊顯示來自其導入的其他模塊的項目。你應該顯式導入模塊。

module.js ...

var Something = require("./something").Something; 
exports.Something; 

main.js ...

var Something = require("./module").Something; 

重複做到這一點。取而代之的是包含你需要的模塊,擁有它並且不導出模塊不擁有的任何東西。我只包括這個例子來說明出口和要求可以做什麼。


訪問在另一個模塊中創建一個實例...您可以通過出口對象,你會構造導出實例。

module.js ...

function MySomething() { 
    //... 
} 
exports.mySomething = new MySomething(); 

main.js ...

var mySomething = require("./module").mySomething; 

通過導入構造的實例,訪問構造的一個實例,它也已導入...您可以通過this範圍公開它,在這種情況下,它可以通過您創建的實例的公共成員訪問您導入的構造函數。

module.js ...

var Something = require("./something").Something; 
function MySomething() { 
    this.something = new Something(); 
} 
exports.MySomething = MySomething; 

main.js ...

var MySomething = require("./module").MySomething; 
var mySomething = new MySomething(); 
mySomething.something;