не требует работы, если не использует назначение деструктуризации - PullRequest
0 голосов
/ 27 мая 2018

В моем nodejs у меня есть маленький mongoose модуль, который exports model (User).Когда мне требуется модуль без использования присваивания destructuring и я создаю новый экземпляр модели с помощью оператора new, я получаю error, что модель не является функцией.Но если я использую назначение destructuring, когда я require модель, все работает нормально.Не в состоянии понять, почему.

User.js экспортирует модель

const mongoose = require('mongoose');

exports.User = mongoose.model('User', {
    email:{
        type: String,
        trim: true,
        minlength: 1,
        reuqired: true
    }
});

Ниже выдается код ошибки, если я не использую оператор деструктурирования в строке 2 :
server.js

const mongoose = require('../DB/mongoose');
const User = require('../Models/User');

console.log(typeof(User));

let user = new User({
    email: "sdfdsf"
});

server.js выдает следующее сообщение об ошибке:

let user = new User({
           ^

TypeError: User is not a constructor
    at Object.<anonymous> (F:\javascript\nodePractice\ToDoApp\server\server.js:6:12)
    at Module._compile (internal/modules/cjs/loader.js:678:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:689:10)
    at Module.load (internal/modules/cjs/loader.js:589:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:528:12)
    at Function.Module._load (internal/modules/cjs/loader.js:520:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:719:10)
    at startup (internal/bootstrap/node.js:228:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:576:3)

Но если я использую присваивание destructuring на line 2, все работает нормально. server.js :

const mongoose = require('../DB/mongoose');
const {User} = require('../Models/User');

console.log(typeof(User));

let user = new User({
    email: "sdfdsf"
});

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Вы экспортируете объект со свойством «Пользователь», в котором размещается модель.При импорте вам нужно указать, какую часть файла вы хотите импортировать, или вам нужно позже указать, какое свойство вы хотите использовать.Вы по-прежнему можете использовать

const User = require('../Models/User');

Но вам нужно будет позвонить User.User, чтобы получить доступ к exports.User позже:

let user = new User.User({ //call exports.User from User model file
    email: "sdfdsf"
});
0 голосов
/ 27 мая 2018
const {User} = require('../Models/User');

эквивалентно

const User = require('../Models/User').User;
//                                    ^^^^^

Объект модуля, который возвращает require() (объект exports, заполненный вашим модулем), имеет свойство .User ,Если вы не обращаетесь к этому, но пытаетесь использовать объект модуля в качестве конструктора, он выдает.

Чтобы быть явным, вы можете использовать

const userModule = require('../Models/User');

console.log(typeof userModule);
console.log(typeof userModule.User);

let user = new userModule.User({
    email: "sdfdsf"
});

В качестве альтернативы, если вы настаиваетевыполнив const User = require('../Models/User');, вы также можете сделать функцию конструктора экспортированным объектом, переписав module.exports вместо создания свойства для него:

const mongoose = require('mongoose');

module.exports = mongoose.model('User', {
    …
});
...