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

时间:2018-05-27 16:22:48

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

在我的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 :(得分:4)

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', {
    …
});

答案 1 :(得分:1)

您正在导出一个具有名为&#34; User&#34;托管模型的人。导入时,您需要指定要导入的文件的哪个部分,或者稍后需要指定要使用的属性。你仍然可以使用

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

但您需要致电User.User,稍后访问exports.User

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