2013-08-05 139 views
0

我真的很困惑变量范围问题,需要通过配置文件中的路径文件。为什么我的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(); 

回答

0

我相信这个问题是你创建了一个循环依赖。故事执行require(config.models)这需要在index.js内再次发生故事。

而不是存储的字符串和require无处不在荷兰国际集团它,尝试直接在config.models存储模型:

config.js

module.exports = { 
    test: 'test', 
    models: require(__dirname + '/models') 
}; 
+0

这导致类似但不同的意外行为。如果我在'app.js'和'story.js'中进行更改并更改'require'调用,那么现在如果从'app.js'和'baz调用方法,我会得到'baz,undefined,undefined',测试...'接着是预期的结果(我的模型对象的转储)。现在更加困惑。完全不同的行为取决于创建对象的位置。现在,显然如果对象是在story.js中创建的,它可以看到'config.js',但是如果它是在'app.js'中创建的,则可以看到'config.js'。 –

0

在任何人的情况下运行到同样的问题,我想指出我遇到的一些资源,帮助我解决了这个问题。正如ssafejava指出的那样,问题的确与循环依赖有关(尽管ssafejava的解决方案并未完全解决问题)。对我来说工作是从我的应用程序设计此依赖项,但如果这样做是不可能的,还有其他选项。请参阅下面的问题为一个更好的解释意见(尤其是看到“艾萨克斯的意见):

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

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

相关问题