我对通过配置文件中的路径所需的文件的变量范围问题感到困惑。为什么我的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);
当我在app.js中创建一个新的Story
并调用其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();
答案 0 :(得分:0)
我认为问题是你已经创建了一个循环依赖。故事执行require(config.models)
,index.js
内再次需要故事。
尝试将模型直接存储在require
:
config.models
将其存储在任何地方。
<强> config.js 强>
module.exports = {
test: 'test',
models: require(__dirname + '/models')
};
答案 1 :(得分:0)
如果有人遇到同样的问题,我想指出我遇到的一些资源帮助我解决了这个问题。正如ssafejava指出的那样,问题确实与循环依赖有关(尽管ssafejava的解决方案并没有完全解决问题)。对我来说有用的是从我的应用程序中设计这种依赖性,但如果无法做到这一点,还有其他选择。请参阅以下问题的评论以获得更好的解释(特别是参见'isaacs'评论):