構成ファイルのパスを介して必要なファイルの変数スコープの問題について、私は本当に混乱しています。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);
Story
app.js でnew を作成してそのtest()
メソッドを呼び出すと、次の出力が得られます。
baz
(だから私はそれが同じファイル内のオブジェクトを見ていることを知っています)
test
(だから私はそれが設定ファイルで変数を見ていることを知っています)
{}
(これはモデルオブジェクトをログに記録する必要がありますが、空のオブジェクトをログに記録するのはなぜですか?)
ファイル内に新しいStory
オブジェクトを作成して実行すると ( )、期待どおりの値が返されます (空のオブジェクトではなくモデル オブジェクトがログに記録されます)。story.js
node ./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();