利用自定义控制器中的蓝图/水线 findWhere

Take advantage of blueprints / waterline findWhere inside custom controller

我有一个 bear 模型,我将它与 blueprint REST.

一起使用
// api/models/Bear.js

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

我想根据与标准 findWhere 完全相同的标准对熊进行一些计算。事实上,我希望能够请求

GET /bear/details

完全符合我的要求

GET /bear

所以我可以通过 :

找到熊的详细信息

控制器看起来像这样:

// 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 请求一样自动过滤模型,而无需重新发明轮子?

显然是我自己在研究 sails' find() source code. One can use actionUtilparseCriteria(req) 时发现的。为了清洁目的,我个人将其包装成服务。

大致:

api/services/ActionUtilService.js

module.exports = require('../../node_modules/sails/lib/hooks/blueprints/actionUtil');

api/controllers/BearController.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);
    });
  }
};

为了干净起见,我把它包进了