Воспользуйтесь преимуществами blueprints / waterline findWhere внутри пользовательского контроллера

#rest #sails.js #waterline

#rest #sails.js #ватерлиния

Вопрос:

У меня есть модель bear, и я использую ее с blueprint REST.

 // api/models/Bear.js

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

Я хотел бы выполнить некоторые вычисления для медведей, основанные на тех же критериях, что и стандартные findWhere . Действительно, я хотел бы иметь возможность запрашивать

 GET /bear/details
 

точно так же, как я прошу

 GET /bear
 

Так что я мог бы найти детали медведя с :

  • сложный запрос, подобный ?where={}
  • такие поля, как ?name=
  • но также отправка json в теле, например {name: ''}
  • или, может быть, даже с использованием ?limit= etc.

Контроллер выглядит следующим образом :

 // 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:

По-видимому, я понял это сам, копаясь в исходном коде sails. find() Можно использовать actionUtil parseCriteria(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);
    });
  }
};
 

Для чистоты я завернул его в