Mon goose «Модель не является конструктором» ошибка - PullRequest
0 голосов
/ 28 апреля 2020

Так что это похоже на довольно популярную ошибку. И после просмотра всех предыдущих вопросов я отправляю это, поскольку они не решают мою проблему. Наиболее распространенными ошибками было использование module.export вместо module.exports и вызов нового экземпляра схемы вместо модели. Я не делаю ни одной из этих ошибок. Вот код.

const db = require('mongoose');

db.Promise = global.Promise;

db.connect(process.env.MONGODB_URI || 'mongodb://localhost/mydb').then(
    () => {console.log('Connection to database established')}
).catch((err) => {
    console.log(err);
});

module.exports = {db};

const {db} = require('./dbconf');

// Schema for users
let UserSchema = new db.Schema({
    username : {
        type : String,
        required : true,
        trim : true,
        min : 1,
        unique: true
    },
    password : {
        type : String,
        required : true,
        trim : true,
        min : 8
    },
    name : {
        type : String,
        required : true,
        trim : true,
        min : 1
    },
    email : {
        type : String,
        required : true,
        trim : true,
        min : 1,
        unique : true
    }
});

const User = db.model('User', UserSchema);
module.exports = {User};

const {User} = require('../db/models');

let user = new User({
    username : username,
    password : password,
    name : name,
    email : email
});

А вот в let user = new User({ я получаю TypeError: User is not a constructor

1 Ответ

0 голосов
/ 28 апреля 2020

Я помню, что у меня была похожая проблема с webpack / typescript.

Попробуйте экспортировать модуль как

module.exports.User = User;

и импортировать весь индексный файл БД без использования деструктора ... просто чтобы увидеть если это что-то меняет.

const models = require('../db/models');
const user = new models.User(...);

В моем случае это было то, что веб-пакет испортил импорт.

Быстрое редактирование: я создал ту же настройку, что и вы (с последний пн goose).

// models file
const userSchema = new Schema({
    message: { type: String, maxlength: 5000 }
});
const User = mongoose.model('User', userSchema);
module.exports.User = User;

// another file
const { User } = require('./testmodels.js');
console.log('==>', User  );

will log out 
==> function model(doc, fields, skipId) {
      model.hooks.execPreSync('createModel', doc);
      if (!(this instanceof model)) {
        return new model(doc, fields, skipId);
      }
      const discriminatorKey = model.schema.options.discriminatorKey;
      if (model.discriminators == null || doc == null || doc[discriminatorKey] == null) {
        Model.call(this, doc, fields, skipId);
        return;
      }
      // If discriminator key is set, use the discriminator instead (gh-7586)
      const Discriminator = model.discriminators[doc[discriminatorKey]] ||
        getDiscriminatorByValue(model, doc[discriminatorKey]);
      if (Discriminator != null) {
        return new Discriminator(doc, fields, skipId);
      }
      // Otherwise, just use the top-level model
      Model.call(this, doc, fields, skipId);
    }

Просто из любопытства, что произойдет, если вы попытаетесь вызвать конструктор следующим образом.

let user = new User.User({
    username : username,
    password : password,
    name : name,
    email : email
});

Еще одно обновление: я опробовал ваш пример код, и он работает для меня (я также проверил с последней версией Mon go, и он все еще работал). Единственное, что мне пришлось изменить в вашем примере, это строка экспорта модуля, куда вы экспортировали только MK, а не модель User.

module.exports = {User, SigningKey, MK};

enter image description here

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