我真的很困惑变量范围问题,需要通过配置文件中的路径文件。为什么我的Mongoose模式方法在从模型文件中调用时“看到”所需的对象,但从我的app.js
文件中调用时却没有?我相信我一定会做出明显错误的事情,但我看不到它。为什么我的Mongoose模式方法“不能”看到我需要的对象?
节点项目有以下(简化的)结构:
|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);
当我在app.js中创建一个新的Story
,并调用它的test()
方法,我得到这个输出:
baz
(所以我知道这是看到在同一个文件对象)
test
(所以我知道这是看到在配置文件中的变量)
{}
(“本应该”记录我的模型对象,但它记录一个空的对象,为什么?)
当我创建story.js
文件中的新Story
对象,并运行它(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();
这导致类似但不同的意外行为。如果我在'app.js'和'story.js'中进行更改并更改'require'调用,那么现在如果从'app.js'和'baz调用方法,我会得到'baz,undefined,undefined',测试...'接着是预期的结果(我的模型对象的转储)。现在更加困惑。完全不同的行为取决于创建对象的位置。现在,显然如果对象是在story.js中创建的,它可以看到'config.js',但是如果它是在'app.js'中创建的,则可以看到'config.js'。 –