利用蓝图/水线findWhere内部自定义控制器

时间:2016-10-13 16:34:17

标签: rest sails.js waterline

我有一个 bear 模型,我在蓝图REST 中使用它。

// api/models/Bear.js

module.exports = {
  attributes: {
    name: {
      type: 'string',
      required: true
    }
  }
};

我想基于与标准findWhere完全相同的标准对熊进行一些计算。确实,我希望能够提出要求

GET /bear/details

就像我要求的那样

GET /bear

所以我可以找到熊的详细信息:

  • 复杂查询,例如?where={}
  • ?name=
  • 等字段
  • 还可以像{name: ''}
  • 一样发送json
  • 或者甚至可能使用?limit=等。

控制器如下所示:

// api/controllers/BearController.js

module.exports = {
  getDetails: function (req, res) {
    Bear.find().exec(function (err, bears){
      if (err) return res.serverError(err);

      var bearsDetails = _.map(bears, function(bear) {
        return {
          id: bear.id,
          nameLength: bear.name.length,
          reversedName: bear.split('').reverse().join('')
        };
      });

      return res.json(bearsDetails);
    });
  }
};

我有一个看起来像这样的自定义路线

// config/routes.js

module.exports.routes = {
  'get /bear/details': 'BearController.getDetails'
}

=> 如何在自定义控制器中自动过滤与findWhere请求完全相同的模型,而无需重新发明轮子?

1 个答案:

答案 0 :(得分:0)

显然我自己想到了sails' find() source code。可以使用actionUtil' module.exports = require('../../node_modules/sails/lib/hooks/blueprints/actionUtil'); 。为了清洁目的,我个人将其包装成服务。

粗略地说:

<强> API /服务/ ActionUtilService.js

module.exports = {
  getDetails: function (req, res) {
    let criteria = ActionUtilService.parseCriteria(req);

    Bear.find(criteria).exec(function (err, bears){
      if (err) return res.serverError(err);

      var bearsDetails = _.map(bears, function(bear) {
        return {
          id: bear.id,
          nameLength: bear.name.length,
          reversedName: bear.split('').reverse().join('')
        };
      });

      return res.json(bearsDetails);
    });
  }
};

<强> API /控制器/ BearController.js

{{1}}

为了清洁,我把它包裹进了