Sails.js 通过API在SailsJS中选择特定列

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

我想选择从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%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”查询中的列数)。我想这对“不稳定”的部分填充模型是有意义的。再次感谢。是的,你是对的。但这是一个快速的解决办法,效果很好:)