Sails WaterlineORM .populate() с ограниченными атрибутами

#sails.js #waterline

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

Вопрос:

Когда мы используем запрос WaterlineORM .populate(), мы получаем все атрибуты заполненной ассоциации.

например:

 User.find({name:'Finn'}).populate('dad').exec(function (err, usersNamedFinn){
    if (err) {
        return res.serverError(err);
    }
    return res.json(usersNamedFinn);
});
  

Ответ:

 [
  {
    id: 7392,
    age: 13,
    name: 'Finn',
    createdAt: Wed Dec 25 2003 18:00:00 GMT-0600 (CST),
    updatedAt: Wed Feb 12 2016 18:06:50 GMT-0600 (CST),
    dad: {
      id: 108,
      age: 47,
      name: 'Joshua',
      createdAt: Wed Dec 25 1969 00:00:00 GMT-0600 (CST),
      updatedAt: Wed Jan 10 2015 12:00:00 GMT-0600 (CST),
      dad: null
    }
  },
]
  

Мне нужно получить в ответе только имя и идентификатор заполненной ассоциации ‘dad’ (т. Е. Удалить Другие атрибуты dad из ответа)

Как я могу это сделать?

Ответ №1:

Подробная информация здесь https://github.com/balderdashy/waterline/issues/919

Похоже, что это было добавлено в версии 0.12.3

 populate('relation', { select: ['wantedFields', ...] });
  

Комментарии:

1. Я использую v0.12.4, но он по-прежнему заполняет все поля, когда я использовал populate('dad', { select: ['name', 'id'] });

2. У меня версия 0.12.4, и я попробовал это populate('dad', { select: ['id', 'name'] }); , но это не имело никакого значения. Все еще заполняю все поля.

3. @ShanikaEdiriweera Я вас слышу, однако решение, которое я предлагаю, должно работать в соответствии с командой sails. Вы должны сообщить об ошибке / проблеме на их странице github.

4. Я провел несколько тестов. В настоящее время он работает только с совокупностью отношений «один ко многим». Я сделал запрос на извлечение, чтобы решить проблему взаимно однозначного отношения: github.com/balderdashy/waterline/pull/1613

Ответ №2:

в вашей модели вы можете написать метод toJSON(), который будет манипулировать объектом:

 toJSON() {
  // getting the object...
  let obj = this.toObject();

  // removing some attributes...
  delete obj.createdAt;
  delete obj.updatedAt;

  return obj;
}
  

а затем в контроллер после «заполненных» результатов запроса, которые вы можете сделать:

 .exec(function(err, usersNamedFinn){
  if(err){
    return res.negotiate(err);
  }

  return res.json(usersNamedFinn);
});
  

Надеюсь, это может вам помочь