UnhandledPromiseRejectionWarning: TypeError: place.toObject не является функцией - PullRequest
5 голосов
/ 21 января 2020

Здесь я пытаюсь выбрать места, созданные пользователями, используя userId. Вот модель пользователя и модель мест, а в контроллере я пишу logi c для выборки мест по userId. К сожалению, я получаю сообщение об ошибке «UnhandledPromiseRejectionWarning: TypeError: place.toObject не является функцией» во время отправки ответа в методе res. json ({}).

Place Model

const mongoose = require('mongoose');

const Schema = mongoose.Schema;


const placeSchema = new Schema({
    title: { type: String, required: true },
    description: { type: String, required: true },
    image: { type: String, required: true },
    address: { type: String, required: true },
    location: {
        lat: { type: Number, required: true },
        lng: { type: Number, required: true },
    },
    creator: { type: mongoose.Types.ObjectId, required: true, ref: 'User'}
});

module.exports = mongoose.model('placemodels', placeSchema);

Модель пользователя

const mongoose = require('mongoose');
const uniqueValidator = require('mongoose-unique-validator');

const Schema = mongoose.Schema;


const userSchema = new Schema({
    name: { type: String, required: true },
    email: { type: String, required: true, unique: true },
    password: { type: String, required: true, minlength: 6 },
    image: { type: String, required: true },
    places: [{ type: mongoose.Types.ObjectId, required: true, ref: 'Place'}]
});

userSchema.plugin(uniqueValidator);

module.exports = mongoose.model('usermodels', userSchema);

Контроллер

const getPlacesByUserId = async (req, res, next) => {
  const userId = req.params.uid;
  let userWithPlaces;
  try {
    userWithPlaces = await User.findById(userId).populate('placemodels');
  } catch (err) {
    console.log(err);
    const error = new HttpError(
      'Fetching places failed, please try again later',
      500
    );
    return next(error);
  }

  // if (!places || places.length === 0) {
  if (!userWithPlaces || userWithPlaces.places.length === 0) {
    return next(
      new HttpError('Could not find places for the provided user id.', 404)
    );
  }

  res.json({
    places: userWithPlaces.places.map(place =>
      place.toObject({ getters: true })
    )
  });
};

1 Ответ

1 голос
/ 29 января 2020

Ссылки действительно важны в понедельник goose заполнить. В схеме refs ссылается на имя схемы mon goose. Так как имена: 'placemodels' и 'usermodels'. Поля refs должны использовать точное имя.

Ссылка: https://mongoosejs.com/docs/api.html#schematype_SchemaType -ref

Вторая важная часть - это параметры методов заполнения. В документации указано, что первым аргументом функции populate является путь имени и объект или строка. В приведенном выше случае используется строка. Следует заполнить поле имени для заполнения.

Это означает, что код должен быть следующим, потому что мы хотим заполнить поле places. Схема должна знать, откуда взять информацию

...

userWithPlaces = await User.findById(userId).populate('places');

...

Ссылки: https://mongoosejs.com/docs/api.html#query_Query -заполнить

...