2013-04-21 125 views
2

我已经定义了2架构如下对象(用于在MongoDB中)复合JS关系访问

var User = describe('User', function() { 
    property('name', String); 
    property('email', String); 
    property('password', String); 
    set('restPath', pathTo.users); 
}); 

var Message = describe('Message', function() { 
    property('userId', String, { index : true }); 
    property('content', String); 
    property('timesent', Date, { default : Date }); 
    property('channelid', String); 
    set('restPath', pathTo.messages); 
}); 

Message.belongsTo(User, {as: 'author', foreignKey: 'userId'}); 
User.hasMany(Message, {as: 'messages', foreignKey: 'userId'}); 

但我无法访问相关的消息对象:

action(function show() { 
    this.title = 'User show'; 

    var that = this; 
    this.user.messages.build({content:"bob"}).save(function(){ 
     that.user.messages(function(err,message){ 
      console.log('Messages:'); 
      console.log(message); 
     }); 
    }); 
    // ... snip ... 
    } 
}); 

尽管新消息被添加到消息集合中,消息阵列始终为空。

我通过mongo shell运行了db.Message.find({userId:'517240bedd994bef27000001'}),并显示了您所期望的消息,因此我开始想知道the mongo adapter是否存在问题。

One to Many relationship in CompoundJS显示类似的问题(我认为)。

据我可以从文档工作,这应该工作。我究竟做错了什么?

编辑:

将更改应用到我的架构由阿纳托利建议后,我放弃了我的Mongo的数据库和更新的NPM但后来当我试图创建我得到了以下新用户:

Express 
500 TypeError: Object #<Object> has no method 'trigger' in users controller during "create" action 
at Object.AbstractClass._initProperties (/mnt/share/chatApp2/node_modules/jugglingdb/lib/model.js:123:10) 
at Object.AbstractClass (/mnt/share/chatApp2/node_modules/jugglingdb/lib/model.js:31:10) 
at Object.ModelConstructor (/mnt/share/chatApp2/node_modules/jugglingdb/lib/schema.js:193:23) 
at Function.AbstractClass.create (/mnt/share/chatApp2/node_modules/jugglingdb/lib/model.js:222:15) 
at Object.create (eval at (/mnt/share/chatApp2/node_modules/compound/node_modules/kontroller/lib/base.js:157:17), :16:10).... 

EDIT2: 创建行动:

action(function create() { 
    User.create(req.body.User, function (err, user) { 
     respondTo(function (format) { 
      format.json(function() { 
       if (err) { 
        send({code: 500, error: user && user.errors || err}); 
       } else { 
        send({code: 200, data: user.toObject()}); 
       } 
      }); 
      format.html(function() { 
       if (err) { 
        flash('error', 'User can not be created'); 
        render('new', { 
         user: user, 
         title: 'New user' 
        }); 
       } else { 
        flash('info', 'User created'); 
        redirect(path_to.users); 
       } 
      }); 
     }); 
    }); 
}); 
+0

“创建”操作的代码是什么? – Anatoliy 2013-05-22 09:17:21

+0

@Anatoliy更新了问题:) – Spike 2013-05-22 16:55:36

回答

1

这是ObjectID的问题。在你的架构代码:

property('userId', String, { index : true }); 

所以用户id是字符串,但是当你调用使用user.messages user.id(和它的一个对象ID)。 作为解决方案,只需从模式定义中删除此行。

P.S.在您的情况下,您可以将关系定义为:

Message.belongsTo('author', {model: User, foreignKey: 'userId'}); 
User.hasMany('messages'); 
+0

感谢您的帮助,我申请了上述内容,但重新启动复合应用程序后问题仍然存在。所以我放弃了mongo数据库并做了'npm update'。然后,我在'create'期间得到'TypeError:Object#'在用户控制器中的Object.AbstractClass._initProperties(/mnt/share/chatApp2/node_modules/jugglingdb/lib/model.js:123:10)处没有方法'触发' 尝试创建新用户时的“操作”。 – Spike 2013-05-11 09:39:45