3

我有一个名为 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 技巧来公开它?

谢谢!

4

1 回答 1

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 中可以实现以下所有功能......

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

模块.js...

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

主.js...

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

重复要这样做而是从拥有它的模块中包含您需要的内容,并且不要导出该模块不拥有的任何内容。我只包含这个示例来阐明 export 和 require 可以做什么。


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

模块.js...

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

主.js...

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

通过导入的构造函数的实例,访问它也导入的构造函数的实例......您可以通过this范围公开它,在这种情况下,它将可以通过您创建的实例的公共成员访问您导入的构造函数.

模块.js...

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

主.js...

var MySomething = require("./module").MySomething;
var mySomething = new MySomething();
mySomething.something;
于 2012-10-13T19:34:51.257 回答