我试图用风帆填充模型的模型,不幸的是它不起作用。
我有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无法进行深度填充,所以我尝试使用循环来填充每个文章的关联图像并将其设置为对话,但文章永远不会在对话中设置。
我该如何解决?
答案 0 :(得分:2)
根据最后的U std::__1::basic_ostream<char, std::__1::char_traits<char> >::sentry::operator bool() const
判断,您似乎有一个需要编写异步代码的问题。但是你在同步if(i==conversations.length)
循环中迭代i
,所以在任何数据库查询运行之前你的响应就会发生。将forEach
和i++
移到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