3

このような UserProvider というモジュールが 1 つあります。

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);アクセスできません。 UserProviderModelProvider

これを呼び出そうとすると:

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);
}

これで、この割り当てはコード内の3つの場所で発生する可能性があります...

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;
于 2012-10-13T19:34:51.257 に答える