我正在寻求扭转并限制结果。逆转工作正常,限制工作正常,但链接在一起,结果不是我所期望的。如果limit设置为10,我得到0结果。如果它设置为200我得到6个结果。知道是什么导致了这个吗?
Users
.query(q => {
q.orderBy('id', 'DESC').limit(10)
})
.fetch({withRelated: ['groups']})
.then(function(users) {
util.filterUsers(users.map(function(user) {
var groups = user.related('groups');
return {
id: user.id,
handle: user.get('handle'),
githubid: user.get('githubid'),
name: user.get('name'),
public: user.get('public'),
url: user.get('url_hash'),
image: user.get('image'),
email: user.get('email'),
groups: groups.reduce(function(prev, group) {
prev[group.id] = group.get('group_name');
return prev;
}, {}),
};
}), req.user.id)
.then((results) => {
res.status(200).send(results);
});
答案 0 :(得分:2)
每个then()
都应该返回一个承诺本身。如果返回一个公共值,Bluebird(Bookshelf的Promises选择)将其转化为一个承诺本身。
在您的情况下,then(function(users) {...})
未返回任何内容,因此应将其替换为tap(function(users) {...})
。请参阅Bluebird文档中的tap。
但是 IF util.filterUsers(...);
以某种方式转换列表并且它本身就是一个承诺,你必须返回它,所以把它的调用置于{{1}之下声明:return
。在这种情况下,它可能会返回少于的用户数量(这是过滤器通常执行的操作...)。
答案 1 :(得分:0)
您需要在函数util.filterUsers
之前添加一个return语句。试试这个
Users
.query(q => {
q.orderBy('id', 'DESC').limit(10);
})
.fetch({withRelated: ['groups']})
.then(function(users) {
return util.filterUsers(users.map(function(user) {
var groups = user.related('groups');
return {
id: user.id,
handle: user.get('handle'),
githubid: user.get('githubid'),
name: user.get('name'),
public: user.get('public'),
url: user.get('url_hash'),
image: user.get('image'),
email: user.get('email'),
groups: groups.reduce(function(prev, group) {
prev[group.id] = group.get('group_name');
return prev;
}, {})
};
}), req.user.id);
})
.then((results) => {
res.status(200).send(results);
});