代码之家  ›  专栏  ›  技术社区  ›  kumarmo2

如果不使用析构函数赋值,则要求不工作

  •  2
  • kumarmo2  · 技术社区  · 7 年前

    在我的 nodejs ,我有一个小的 mongoose 模块 exports 这个 model (User) . 当我需要模块而不使用时 destructuring 赋值和我使用创建模型的新实例 new 接线员,我知道 error 模型不是函数。但如果我使用 破坏 当我 require 模型,一切正常。无法理解原因。

    用户.js 导出 模型

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

    如果我不在上使用析构函数运算符,下面的代码将引发错误 第2行 :
    服务器.js

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

    服务器.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)
    

    但是如果我用 破坏 转让 line 2 ,一切正常。 服务器.js :

    const mongoose = require('../DB/mongoose');
    const {User} = require('../Models/User');
    
    console.log(typeof(User));
    
    let user = new User({
        email: "sdfdsf"
    });
    
    2 回复  |  直到 7 年前
        1
  •  5
  •   Bergi    7 年前
    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', {
        …
    });
    
        2
  •  1
  •   Luca Kiebel    7 年前

    您正在导出一个对象,该对象具有承载模型的名为“用户”的属性。导入时,需要指定要导入文件的哪个部分,或者稍后需要指定要使用的属性。你仍然可以使用

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

    但是你需要打电话 User.User ,正在访问 exports.User 后来:

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