0

構成ファイルのパスを介して必要なファイルの変数スコープの問題について、私は本当に混乱しています。Mongoose スキーマ メソッドが、モデル ファイル内から呼び出されたときに必要なオブジェクトを「参照」するのに、ファイルから呼び出されたときに参照できないのはなぜapp.jsですか? 私は明らかに間違ったことをしているに違いないと確信していますが、それを見ることはできません。

Node プロジェクトには、次の (簡略化された) 構造があります。

|models
    -index.js
    -story.js
    -post.js
-app.js
-config.js

これは config.js です:

config = {};

config.test = 'test';
config.models = __dirname + '/models';

module.exports = config;

これはstory.jsです:

var config = require('../config.js');
var models = require(config.models);

var foo = {};
foo.bar = 'baz';

var storySchema = mongoose.Schema
({
    author: {type: mongoose.Schema.Types.ObjectId},
    root: {type: mongoose.Schema.Types.ObjectId, default: null}
});

storySchema.methods.test = function()
{
    console.log(foo.bar);
    console.log(config.test);
    console.log(models);
}

var Story = exports.model = mongoose.model('story', storySchema);

Storyapp.js でnew を作成してそのtest()メソッドを呼び出すと、次の出力が得られます。

baz(だから私はそれが同じファイル内のオブジェクトを見ていることを知っています)

test(だから私はそれが設定ファイルで変数を見ていることを知っています)

{}(これはモデルオブジェクトをログに記録する必要がありますが、空のオブジェクトをログに記録するのはなぜですか?)

ファイル内に新しいStoryオブジェクトを作成して実行すると ( )、期待どおりの値が返されます (空のオブジェクトではなくモデル オブジェクトがログに記録されます)。story.jsnode ./models.story.js

更新、index.js および app.js ファイルは次のとおりです。

index.js:

module.exports = {
    post: require('./post'),
    story: require('./story')
};

app.js:

var config = require('./config');
var models = require(config.models);
var story = new models.story.model();
story.test();
4

2 に答える 2

0

誰かがこの同じ問題に遭遇した場合に備えて、問題の解決に役立ついくつかのリソースを紹介したいと思います. ssafejava が指摘したように、問題は循環依存関係に関係しています (ただし、ssafejava のソリューションは問題を完全には解決しませんでした)。私にとってうまくいったのは、アプリケーションからこの依存関係を設計することでしたが、それが不可能な場合は他のオプションがあります。より良い説明については、次の問題のコメントを参照してください (特に、「isaacs」のコメントを参照してください)。

https://github.com/joyent/node/issues/1490

https://github.com/joyent/node/issues/1418

于 2013-08-06T01:42:01.080 に答える