在我的 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 online 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/