如果不使用解构赋值则要求不工作

require not working if not using destructuring assignment

在我的 nodejs 中,我有一个小的 mongoose 模块,其中 exports model (User)。当我在不使用 destructuring 赋值的情况下需要模块并使用 new 运算符创建模型的新实例时,我得到 error 该模型不是函数。但是,如果我在 require 模型时使用 destructuring 赋值,则一切正常。无法理解为什么。

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)

But If I use a destructuring assignment on line 2, it works all fine. server.js:

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

console.log(typeof(User));

let user = new User({
    email: "sdfdsf"
});
const {User} = require('../Models/User');

相当于

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

require() returns 的模块对象(你的模块填充的 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', {
    …
});

您正在导出一个对象,该对象有一个名为 "User" 的 属性 托管模型。导入它时,您需要指定要导入文件的哪一部分,或者稍后需要指定要使用的 属性 部分。您仍然可以使用

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

但您需要调用 User.User,稍后访问 exports.User

let user = new User.User({ //call exports.User from User model file
    email: "sdfdsf"
});