Sails.js 通过API在SailsJS中选择特定列
我想选择从sailsjs/waterline/API返回的某些列 给定搜索参数:Sails.js 通过API在SailsJS中选择特定列,sails.js,waterline,Sails.js,Waterline,我想选择从sailsjs/waterline/API返回的某些列 给定搜索参数: var searchParams = { "select":["ClientTypeID"] , "where": { "or" : [{"ClientType": {"contains": "MAINT"}}] }}; 我进行API调用: /api/reference/client_type?select=ClientTypeID&where=%7B%22or%22:%5B%7B%22ClientTyp
var searchParams = {
"select":["ClientTypeID"]
, "where": {
"or" :
[{"ClientType": {"contains": "MAINT"}}]
}};
我进行API调用:
/api/reference/client_type?select=ClientTypeID&where=%7B%22or%22:%5B%7B%22ClientType%22:%7B%22contains%22:%22MAINT%22%7D%7D%5D%7D
基于
我相信我的查询是正确的,但是,返回的JSON对象具有entity的所有列和我希望请求的ClientTypeID的1?这是已知的问题,但我找到了解决方法。您可以用自己的蓝图覆盖默认的
find
blueprint。您需要创建包含以下内容的api/blueprints/find.js
文件:
var _ = require('lodash');
var Promise = require('bluebird');
var actionUtil = require('sails/lib/hooks/blueprints/actionUtil');
var takeAliases = _.partial(_.pluck, _, 'alias');
var populateAliases = function (model, alias) {
return model.populate(alias);
};
module.exports = function (req, res) {
_.set(req.options, 'criteria.blacklist', ['limit', 'skip', 'sort', 'populate', 'fields']);
var fields = req.param('fields') ? req.param('fields').replace(/ /g, '').split(',') : [];
var populate = req.param('populate') ? req.param('populate').replace(/ /g, '').split(',') : [];
var Model = actionUtil.parseModel(req);
var where = actionUtil.parseCriteria(req);
var limit = actionUtil.parseLimit(req);
var skip = actionUtil.parseSkip(req);
var sort = actionUtil.parseSort(req);
var findQuery = _.reduce(_.intersection(populate, takeAliases(Model.associations)), populateAliases, Model.find().where(where).limit(limit).skip(skip).sort(sort));
var countQuery = Model.count(where);
Promise.all([findQuery, countQuery])
.spread(function (_records, _count) {
var records = fields.length > 0 ? _.map(_records, _.partial(_.pick, _, fields)) : _records;
return [records, null, null, {
criteria: where,
limit: limit,
start: skip,
end: skip + limit,
total: _count
}];
})
.spread(res.ok)
.catch(res.serverError);
};
这是我在所有项目中使用的总体蓝图。对于所有固定的蓝图,您可以在这里查看-是的,非常感谢。我最初运行您的示例时遇到问题,我将问题归结为我的lodash版本很旧。我需要版本3+。通过查看stackover flow/git存储库,他们似乎将通过pick/select在v11中实现类似的功能。根据我的阅读和理解,您提供的代码将在发送到客户端时适当过滤列,但是,底层查询和模型已完全填充(即它不会减少“sql”查询中的列数)。我想这对“不稳定”的部分填充模型是有意义的。再次感谢。是的,你是对的。但这是一个快速的解决办法,效果很好:)