#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);
});
}
};
Для чистоты я завернул его в