Я выяснил несколько способов сделать это. Первый способ заключается в том, чтобы вложить ваши запросы, например.
Blog.find()
.limit(30)
.sort('createdAt desc')
.where({ isPublished: 1 })
.exec(function(err, posts) {
SomeOtherModel.find()
.limit(5)
.sort('createdAt desc')
.where({ isPublished: 1 })
.exec(function(err, otherdata) {
res.view({
posts: posts,
otherdata: otherdata
});
});
});
Второй способ заключается в использовании обещания (я не был в курсе этого ранее)
User.findOne()
.where({ id: 2 })
.then(function(user){
var comments = Comment.find({userId: user.id}).then(function(comments){
return comments;
});
return [user.id, user.friendsList, comments];
}).spread(function(userId, friendsList, comments){
// Promises are awesome!
}).fail(function(err){
// An error occured
})
Третий путь (я в конечном итоге происходит с этим), чтобы создать политику (конкретные для sailsjs но является экспресс промежуточного слоя)
// saved as /api/policies/recentPosts.js
// also need to add a rule to /config/policies.js
module.exports = function (req, res, ok) {
Blog.find()
.limit(3)
.sort('createdAt desc')
.where({ isPublished: 1 })
.exec(function(err, footerposts) {
res.footerposts = footerposts;
return ok();
});
};
делая это таким образом, вам не нужно, чтобы передать что-нибудь на ваш взгляд, однако Im не уверен, что это хорошая практика, чтобы случайно добавить данные в объект ответа.
Существует довольно много дискуссий, чтобы избавиться от библиотеки Q, и вместо этого сделать это подключаемым, как ES6 pro mises, Bluebird и т. д. Смотрите: https://github.com/balderdashy/sails/issues/1186#issuecomment-56510067 – arcseldon
@arcseldon Да, я был частью более старой дискуссии по Waterline по этому вопросу: https: // github. com/balderdashy/waterline/pull/238, но он никогда не сливался. Команда Sails не очень сильно относится к перфомансу и обещанию в целом. –
@arcseldon на самом деле, они просто слили еще один запрос на тягу: https: // github.com/balderdashy/waterline/pull/487 # event-171216102 –