我对Sails.js(和节点)场景很陌生。
目前我正在创建一个应用程序,用户可以在其中创建博客帖子并在以后查看它们。这一切都很好地检索索引页面上的帖子,虽然我在试图显示作者姓名时遇到了麻烦。
为实现这一目标,我制作了两个模型:帖子和用户。创建帖子后,我会向Post模型添加一个'postedBy'属性,其中包含帖子所属的用户的ID。
现在,在我的索引视图中(我正在显示帖子)我正在做这样的事情:
<% _.each(posts, function(post) { %>
<a href="/post/show/<%= post.id %>">
<div class="post" data-id="<%= post.id %>" data-model="post">
<div class="row panel-body">
<div class="col-xs-7">
<h3><%= post.title %></h3>
<span class="date">By <%= post.postedBy %> <span class="date-nicely"><%= post.createdAt %></span></span>
</div>
<div class="col-xs-4">
<!-- Other markup -->
</div>
</div>
</div>
</a>
<% }); %>
这里的一切都能正常运作。虽然我想通过使用'postedBy'属性搜索来访问用户的数据,但我可以显示他们的名字和其他东西。我不想将海报的名称直接存储到Post模型中,因为用户名可能会发生变化,并且应该直接链接到用户名。
'index': function(req, res, next) {
var customerID = req.session.User.customerID;
Post.find()
.where({ customerID: customerID })
.limit(5)
.sort('createdAt DESC')
.done( function foundPosts(err, posts) {
if ( err ) {
return next(err);
}
res.view({
posts: posts,
layout: req.session.layout
});
}
);
},
在我的控制器中,我试图遍历从MongoDB获得的帖子(使用Post.find()。limit(5).sort('createdAt DESC')。done(function(err,posts){ }); - 像这样的东西)。我已经阅读了Sail.js / waterline文档中的Promised,虽然我无法让它工作,以便我可以访问每个Post循环中的特定用户。
答案 0 :(得分:1)
要实现这一目标,您有两种选择:
使用Sails.js版本0.9
您必须嵌套查询。看一下这个例子:
在.done()
函数中:
.done(function foundPosts(err, posts) {
posts.forEach(function(post){
User.find().where({ owner: post.ownerID }).done(function (err, user) {
// create new property on the post object
post.user = user.ownerName;
});
});
res.view({
posts: posts,
layout: req.session.layout
});
}
使用Sails.js版本0.10
在(当前)最新版本的sails.js中,您有 association 。这意味着您可以在模型架构中建模关联。例如:
// From the file: myApp/api/models/posts.js
module.exports = {
attributes: {
title:'STRING',
body:'STRING',
author:{
model: 'user' // Here you associate the user model
}
}
}
这意味着,在您的查询中,您可以执行以下操作:
Post.find().where({ customerID: customerID }).populate('user').exec(function(err, posts){
res.view({
posts: posts,
layout: req.session.layout
});
});