MissingSchemaError при использовании Mongoose Заполните только одну модель - PullRequest
0 голосов
/ 06 ноября 2018

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

У меня странная проблема с mongoose при заполнении только одного конкретного массива идентификаторов.

У меня есть три модели: пользователь, компания и виджеты.

Когда я возвращаюсь в компанию, заполненную пользователями, все в порядке, используя:

Company.findOne({ name: 'xyz' })
    .populate('users')
    .exec(function(err, company) {
    if (err) return res.send(err)
    res.send(company)
    })

Однако, когда я пытаюсь заменить заполненные «пользователи» на «виджеты», я получаю следующую ошибку:

{
    "message": "Schema hasn't been registered for model \"widget\".\nUse mongoose.model(name, schema)",
    "name": "MissingSchemaError"
}

Вот модели:

USER:

const UserSchema = new Schema({
    name: String,
    email: {
        type: String,
        unique: true,
        required: true
    },
    password: {
        type: String,
        required: true
    },
    company: {
    type: Schema.Types.ObjectId,
    ref: 'company'
    }
});

const User = mongoose.model("user", UserSchema);

Компания:

const CompanySchema = new Schema({
    name: String,
    URL: {
        type: String,
        unique: true
    },
    users: [{
        type: Schema.Types.ObjectId,
        ref: 'user'
    }],
    widgets: [{
        type: Schema.Types.ObjectId,
        ref: 'widget'
    }]
});

const Company = mongoose.model('company', CompanySchema);

WIDGET:

const WidgetSchema = new Schema({
    title: {
        type: String,
        required: true
    },
    maker: String
});

const Widget = mongoose.model('widget', WidgetSchema);

Я вручную проверил _ids в массиве виджетов модели компании, и все они верны.

1 Ответ

0 голосов
/ 06 ноября 2018

ОК, так что это было отсутствие понимания от моего имени.

В модуле, где я использовал:

Company.findOne({ name: 'xyz' })
    .populate('users')
    .exec(function(err, company) {
    if (err) return res.send(err)
    res.send(company)
    })

Я импортировал модель User для других целей в модуле. Однако, поскольку я не имел прямого отношения к виджету, я не импортировал его. Проведя еще несколько исследований, я обнаружил, что вам нужно импортировать модель при заполнении, даже не обращаясь к ней напрямую.

Дайте мне знать, если лучше удалить всю цепочку или оставить для справки.

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