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

标签 javascript node.js ecmascript-6 es6-modules

在我的 nodejs 中,我有一个小的 mongoose 模块,它导出 模型(用户)。当我在不使用 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() 返回的模块对象(您的模块填充的 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', {
    …
});

关于javascript - 如果不使用解构赋值则要求不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50554170/

相关文章:

javascript - element.style.fontSize 不返回大小

javascript - Ajax 简单调用不起作用

node.js - 使用 node.js 运行包含多个嵌套引号内带有空格的路径的 powershell 命令时出现问题

javascript - JS解构。如何处理 null 或 undefined 值

JavaScript 幻灯片放映不流畅

javascript - 如何在 ES6 中使弱集或弱映射可迭代?

javascript - 使用 jQuery 和/或 javascript 检索页面上的所有斜体文本片段

javascript - 如何访问类函数内的类变量?

node.js - NodeJS Mongoose Schema 'save' 函数错误处理?

javascript - 如何正确实现 firestore 数据库规则以防止在某些字段更改时更新数据?