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);

Story当我在 app.js 中创建一个新的并调用它的test()方法时,我得到这个输出:

baz(所以我知道它在同一个文件中看到对象)

test(所以我知道它在配置文件中看到变量)

{}(这个“应该”记录我的模型对象,但它记录了一个空对象,为什么?)

当我在文件中创建一个新Story对象story.js并运行它(node ./models.story.js)时,返回的值与预期的一样(模型对象被记录,而不是一个空对象)。

更新,这里是 index.js 和 app.js 文件:

index.js:

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

应用程序.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 回答
0

我认为问题在于您创建了循环依赖项。Story 执行require(config.models)需要再次在里面进行 Story index.js

与其在任何地方存储一个字符串,不如require尝试将模型直接存储在config.models

配置.js

module.exports = {
  test: 'test',
  models: require(__dirname + '/models')
};
于 2013-08-05T02:09:27.027 回答