Странно отличается при использовании .populate () в отдельном методе между findById () и find () - PullRequest
2 голосов
/ 25 мая 2020

Итак, я прочитал код своего старшего и увидел, что он сделал что-то вроде этого:

const getTechnicianByIdQuery = await TechnicianModel.findById({id: someId});
const wantedTechnician = await this.populateSingleTechnician(getTechnicianByIdQuery);

const populateSingleTechnician(technician: any): Promise<Technician>{
    const populatedTechnician = await technician
        .populate({path: 'salon',})
        .populate({path: 'user',})
        .execPopulate();
    return populatedTechnician;
};

Этот код работает нормально, и я думаю, что его способ сделать это круто, что позволяет нам повторно использовать код, поэтому я попробуйте сделать то же самое с другим поиском, используя find () вместо findById ():

const getTechnicianBySalonQuery = await TechnicianModel.find({salon: someSalonId})
const wantedTechnicianGroup = await this.populateTechnicianGroup(getTechnicianBySalonQuery);

const populateSingleTechnician(technicianGroup: any): Promise<Technician[]>{
    const populatedTechnicians = await technicianGroup
        .populate({path: 'salon',})
        .populate({path: 'user',})
        .execPopulate();
    return populatedTechnicians;
};

Мой код выдает ошибку:

{ошибки: [GraphQLError {сообщение: 'technicianGroup.populate не является функцией', местоположения: [массив], путь: [массив]}], данные: ноль}

Почему мой код выдает эту ошибку а его код работает нормально и возвращает заполненные данные? Если мы скажем, что разделение процесса заполнения, который обычно используется как оператор цепочки, вызвало эту ошибку, мне все равно интересно, какая разница, которая заставляет работать первый блок кода, но не мой.

С другой стороны, я использовал традиционный способ связывания populated () с запросом, и он работал нормально.

1 Ответ

1 голос
/ 25 мая 2020

При связывании вы не должны использовать ключевое слово await. Когда вы используете await, вы выполняете запрос.

Посмотрите на пример документации .

const getTechnicianByIdQuery = TechnicianModel.findById({
  id: someId,
});

const wantedTechnician = await this.populateSingleTechnician(getTechnicianByIdQuery);

const populateSingleTechnician(technician: any): Promise<Technician> {
  const populatedTechnician = await technician
    .populate({
      path: 'salon',
    })
    .populate({
      path: 'user',
    })
    .execPopulate();
  return populatedTechnician;
};

Первый работает, потому что await findById возвращает вам mongoose.Document, для которого доступен метод .populate . Во втором случае mongoose.Document[] не имеет метода populate (потому что это массив).


Я вижу, что вы используете машинописный текст, я настоятельно рекомендую вам ввести свой переменные. Вы бы увидели ошибку в technician.populate, если бы technician: any было заменено на правильный тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...