使用node.js嵌套模块

时间:2012-10-13 18:28:48

标签: javascript node.js express

我有一个名为UserProvider的模块,看起来像这样

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);不允许我访问包含UserProvider模块的主模块中的ModelProvider对象。

当我试着这样说时:

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技巧,我错过了揭露它?

谢谢!

1 个答案:

答案 0 :(得分: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中可能有以下所有内容......

从不一定包含它的模块导入构造函数... 要明确你不应该这样做但是可以链接导出以便模块公开其导入的其他模块中的项目。您明确导入模块。

... module.js

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

... main.js

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

重复执行而不是执行此操作。而是从拥有的模块中包含您需要的内容,而不导出模块不拥有的任何内容。我只包括这个例子来澄清出口和要求可以做什么。


访问在另一个模块中创建的实例... 您可以像导体一样通过exports对象导出实例。

... 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;