gpt4 book ai didi

node.js - Sails.js 填充嵌套关联

转载 作者:太空宇宙 更新时间:2023-11-04 02:21:33 25 4
gpt4 key购买 nike

我有一个关于 Sails.js 版本 0.10-rc5 中关联的问题。我一直在构建一个应用程序,其中多个模型相互关联,并且我已经到达了需要以某种方式进行嵌套关联的地步。

分为三个部分:

首先是由用户撰写的类似博客文章的内容。在博客文章中,我想显示关联用户的信息,例如用户名。现在,这里一切正常。直到下一步:我正在尝试显示与该帖子相关的评论。

评论是一个单独的模型,称为评论。每个都有一个与其关联的作者(用户)。我可以轻松地显示评论列表,尽管当我想显示与评论​​相关的用户信息时,我不知道如何使用用户信息填充评论。

在我的 Controller 中,我试图做这样的事情:

Post
.findOne(req.param('id'))
.populate('user')
.populate('comments') // I want to populate this comment with .populate('user') or something
.exec(function(err, post) {
// Handle errors & render view etc.
});

在我的帖子的“显示”操作中,我尝试检索如下信息(简化):

<ul> 
<%- _.each(post.comments, function(comment) { %>
<li>
<%= comment.user.name %>
<%= comment.description %>
</li>
<% }); %>
</ul>

comment.user.name 是未定义的。如果我尝试只访问“user”属性,例如 comment.user,它会显示它的 ID。这告诉我,当我将评论与另一个模型关联时,它不会自动将用户的信息填充到评论中。

有人想要正确解决这个问题吗:)?

提前致谢!

附注

为了澄清,这就是我在不同模型中设置关联的基本方式:

// User.js
posts: {
collection: 'post'
},
hours: {
collection: 'hour'
},
comments: {
collection: 'comment'
}

// Post.js
user: {
model: 'user'
},
comments: {
collection: 'comment',
via: 'post'
}

// Comment.js
user: {
model: 'user'
},
post: {
model: 'post'
}

最佳答案

或者您可以使用内置的 Blue Bird promise 实现它的功能。 (正在使用 Sails@v0.10.5)

请参阅下面的代码:

var _ = require('lodash');

...

Post
.findOne(req.param('id'))
.populate('user')
.populate('comments')
.then(function(post) {
var commentUsers = User.find({
id: _.pluck(post.comments, 'user')
//_.pluck: Retrieves the value of a 'user' property from all elements in the post.comments collection.
})
.then(function(commentUsers) {
return commentUsers;
});
return [post, commentUsers];
})
.spread(function(post, commentUsers) {
commentUsers = _.indexBy(commentUsers, 'id');
//_.indexBy: Creates an object composed of keys generated from the results of running each element of the collection through the given callback. The corresponding value of each key is the last element responsible for generating the key
post.comments = _.map(post.comments, function(comment) {
comment.user = commentUsers[comment.user];
return comment;
});
res.json(post);
})
.catch(function(err) {
return res.serverError(err);
});

一些解释:

  1. 我正在使用Lo-Dash来处理数组。更多详情请引用Official Doc
  2. 注意第一个“then”函数内的返回值,数组内的那些对象“[post, commentUsers]”也是“promise”对象。这意味着它们在第一次执行时不包含值数据,直到获得值为止。这样“spread”函数将等待 acture 值到来并继续执行其余的操作。

关于node.js - Sails.js 填充嵌套关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33132679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com