使用风帆js填充模型的模型

时间:2015-08-12 18:05:10

标签: json node.js sails.js

我试图用风帆填充模型的模型,不幸的是它不起作用。

我有3个模特

/**
  Conversation.js

**/
module.exports = {

    autoCreatedAt: false,
    autoUpdatedAt: false,
    tableName:'conversation',
    attributes: {
        idConversation:{
            columnName:'IDCONVERSATION',
            primaryKey:true,
            autoIncrement:true,
            unique:true,
            type:'integer',
            index:true
        },
        dateStartConversation:{
          columnName:'DATEDEBUT',
          type:'date',
          index:true
        },
        user1:{
            columnName:'IDUSER1',
            model:'user',
            notNull:true
        },
        user2:{
            columnName:'IDUSER2',
            model:'user',
            notNull:true
        },
        article:
        {
          model:'article',
          columnName:'IDARTICLE',
          notNull:true
        }
    }
};



/**
   Article.js
**/
module.exports = {
    autoPK: false,
    autoCreatedAt: false,
    autoUpdatedAt: false,
    tableName:'article',
    attributes: {
        idArticle:{
            type:'integer',
            unique:true,
            columnName:'IDARTICLE',
            autoIncrement:true,
            primaryKey:true
        },
        title:{
            type:'string',
            required:true,
            columnName:'TITRE',
            index:true,
            notNull:true
        },
        utilisateur:{
            model:'utilisateur',
            columnName:'IDUTILISATEUR',
            required:true,
            notNull:true,
            dominant:true
        },
        images:{
            collection:'image',
            via:'article'
        },

        conversation:{
          collection:'conversation',
          via:'article'
        }
    }
};

/**
   Image.js
**/
module.exports = {
    autoCreatedAt: false,
    autoUpdatedAt: false,
    tableName:'image',
    attributes: {
        idImage:{
            columnName:'IDIMAGE',
            primaryKey:true,
            autoIncrement:true,
            unique:true,
            type:'integer'
        },
        pathImage:{
            columnName:'PATHIMAGE',
            required:true,
            type:'string',
            notNull:true
        },
        article:{
            model:'article',
            columnName:'IDARTICLE',
            notNull:true,
            dominant:true

        }
    }
};

正如您在我的模型中所看到的,两个用户,一篇文章和那些文章cas之间的对话有一个或多个图像。

所以我希望获得一个用户的所有对话,并且我能够填充文章,但我无法在下面填写图片文章

 Conversation.find().populate('article').populate('user1').populate('user2').where({
      or : [
        { user1: iduser },
        { user2: iduser }
      ]})
    .then(function( conversations) {
        var i=0;
        conversations.forEach(function(element,index){
          i++;
          console.log("article "+index+" "+JSON.stringify(element.article));
          Article.findOne({
            idArticle:element.article.idArticle
          }).populate('images').then(function(newArticle){
            //I  try to set article with the newArticle but it don't work
            element.article=newArticle;
          })
          if(i==conversations.length){

            res.json({
              hasConversation:true,
              conversation:conversations
            });
          }
        });

    })

因为使用sails无法进行深度填充,所以我尝试使用循环来填充每个文章的关联图像并将其设置为对话,但文章永远不会在对话中设置。

我该如何解决?

2 个答案:

答案 0 :(得分:2)

根据最后的U std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::operator bool() const 判断,您似乎有一个需要编写异步代码的问题。但是你在同步if(i==conversations.length)循环中迭代i,所以在任何数据库查询运行之前你的响应就会发生。将forEachi++移到if的回调中:

Article.findOne

您还需要在 Conversation.find().populate('article').populate('user1').populate('user2').where({ or : [ { user1: iduser }, { user2: iduser } ]}) .then(function( conversations) { var i=0; conversations.forEach(function(element,index){ console.log("article "+index+" "+JSON.stringify(element.article)); Article.findOne({ idArticle:element.article.idArticle }).populate('images').then(function(newArticle){ // Associate the article with the conversation, // calling `toObject` on it first element.article= newArticle.toObject(); // Done processing this conversation i++; // If we're done processing ALL of the conversations, send the response if(i==conversations.length){ res.json({ hasConversation:true, conversation:conversations }); } }) }); }) 实例上调用toObject,然后再将其分配给对话,因为它包含newArticle属性上的getter和setter,当时它们会出现意外行为复制。

我还建议重构一下以使用async.each,这会使其更具可读性。

答案 1 :(得分:1)

在此问题解决之前(https://github.com/balderdashy/sails-mongo/issues/108),您可以使用我开发的此功能来解决此问题:https://gist.github.com/dinana/52453ecb00d469bb7f12