Bookshelf / knex按降序排序然后限制结果

时间:2016-05-28 09:30:53

标签: promise bluebird bookshelf.js knex.js

我正在寻求扭转并限制结果。逆转工作正常,限制工作正常,但链接在一起,结果不是我所期望的。如果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); });

2 个答案:

答案 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);
      });