【问题标题】:Nesting modules with node.js使用 node.js 嵌套模块
【发布时间】:2012-10-13 18:28:47
【问题描述】:

我有一个名为 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); 行不允许我访问包含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 技巧来揭露这一点?

谢谢!

【问题讨论】:

  • 我认为您还需要在主模块中要求用户模块,或者还将UserProvider 添加到模型模块中的exports 对象中。
  • 对,但是实例化用户模型的实例取决于数据库连接对象,所以我希望Model模块在启动时对其进行初始化,然后将其暴露出来。
  • 所以大概你的主模块中有var model = new ModelProvider()之类的东西,如果你访问model.User你会得到什么?
  • 用错误信息编辑的原始问题
  • 看起来您在那里发生了某种名称冲突,错误似乎表明您有一个名为 Model 的类,它可能与您创建的 ModelProvider 实例混淆了/跨度>

标签: javascript node.js express


【解决方案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;

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


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

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;

【讨论】:

    猜你喜欢
    • 2016-05-10
    • 2017-08-30
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 2016-04-02
    相关资源
    最近更新 更多