编译后无法覆盖“用户”模型。解决后我得到“用户”未定义
Posted
技术标签:
【中文标题】编译后无法覆盖“用户”模型。解决后我得到“用户”未定义【英文标题】:Cannot overwrite `User` model once compiled. When resolved i get 'User' Undefined 【发布时间】:2021-06-04 15:09:45 【问题描述】:我目前正在开发一个购物网站的后端,
在处理我的帖子功能时。我收到这个错误
“OverwriteModelError:编译后无法覆盖User
模型。”
一切正常,直到我去购买角色时,它需要对 User 和 Character 进行搜索查询并将角色推入 User 模型中的数组ownedCharacter 中。
当我删除const User = require('../Model/User');
并在邮递员中测试功能购买字符时,它说用户未定义。
这是模型的代码
const mongoose = require('mongoose');
const UserSchema = new mongoose.Schema(
username:
type: String,
required : true
,
email:
type: String,
required: true
,
password:
type: String,
required: true,
min: 8
,
status:
type:Boolean,
default:false
,
points:
type:Number,
default: 0
,
rank:
type:String,
default:"unranked"
,
avatar:
type:String,
default:""
,
level:
type:Number,
default:0
,
experience:
type:Number,
default:0
,
registrationDate:
type:Date,
default:Date.now()
,
gold:
type:Number,
default:0
,
gems:
type:Number,
default:0
,
ownedCharacter:[
type:mongoose.Schema.Types.ObjectId,
ref:"Character",
],
,timestamps:true);
module.exports = mongoose.model("User", UserSchema);
这是 app.js 的代码
const express = require('express');
const app = express();
const mongoose = require('mongoose');
const dotenv = require('dotenv');
const bodyParser = require("body-parser");
app.use(bodyParser.json());
app.use(bodyParser.urlencoded(
extended: true
));
app.use(express.static('uploads'));
//Import Routes
const authRoute = require ('./Route/Auth');
const authAdminRoute = require ('./Route/Admin_Auth');
const shopRoute = require('./Route/Shop');
dotenv.config();
//Connection to DataBase
mongoose.connect(
process.env.DB_CONNECT,
useNewUrlParser: true, useUnifiedTopology: true,
()=>console.log('connected to database')
);
//MiddleWares
app.use(express.json());
//Route MiddleWares
app.use('/api/user', authRoute);
app.use('/api/admin', authAdminRoute);
app.use('/api/shop',shopRoute);
//Server Listener
app.listen(27017, ()=> console.log("Server Running"));
这是商店路线
const router = require('express').Router();
const User = require('../Model/User');
const Character = require('../Model/Character');
const Skin = require('../Model/Skin');
//admin add character
router.post('/addCharacter', async (req, res) =>
const character = new Character(
name:req.body.name,
price:req.body.price,
story:req.body.story,
ability:
abilityName:req.body.abilityName,
cooldown:req.body.cooldown,
description:req.body.description
,
);
try
const savedCharacter = await character.save();
res.json(savedCharacter);
console.log(character);
catch (error)
);
//add Skin
router.post('/addSkin/:characterId', async (req, res) =>
const skin = new Skin(
name:req.body.name,
price:req.body.price,
description:req.body.description,
characterId: req.params.characterId
);
try
const savedSkin = await skin.save();
res.json(skin);
console.log(skin);
catch (error)
);
//add Monsters
router.post('/addMonster/', async (req, res) =>
const mosnter = new Monster(
name:req.body.name,
price:req.body.price,
description:req.body.description,
);
try
const savedMonster = await monster.save();
res.json(monster);
console.log(monster);
catch (error)
);
//add Traps
router.post('/addTrap', async (req, res) =>
const trap = new Trap(
name:req.body.name,
price:req.body.price,
description:req.body.description,
);
try
const savedTrap = await trap.save();
res.json(trap);
console.log(trap);
catch (error)
);
//buy a Character
router.post('/buyCharacter/:characterId/:userId',async(req,res)=>
try
const user = await User.findOne(_id:req.params.userId);
console.log("user:"+user);
const boughtCharacter = await Character.findOne(_id:req.params.characterId);
user.ownedCharacter.push(boughtCharacter);
user.save();
res.json(boughtCharacter);
console.log(boughtCharacter);
catch (error)
console.log(error.message);
);
module.exports = router;
【问题讨论】:
【参考方案1】:您的 require 语句和文件名之间的大小写是否正确匹配?如果文件名实际上是 /Model/user.js,它可能会抛出这个错误。
【讨论】:
【参考方案2】:错误消息告诉您,不知何故,您不止一次声明了一个名为 User
的模型。除非您在另一个文件中再次明确这样做,否则最好的选择是 User.js
文件被加载两次。发生这种情况的原因有很多,但最可能的原因是您在多个位置导入了../Model/User.js
文件,但您的大小写不一致。
当 Node 加载导入时,它会使用您传递给 require()
... 的解析文件名来缓存它,并且它以区分大小写的方式这样做。这意味着如果您在一个文件中有require(../Model/user)
并且在一个文件中有require(../Model/User)
另外,Node 会加载同一个文件两次,从而执行该文件两次,从而尝试在共享的mongoose
实例上设置名为User
的模型两次,从而为您提供您正在体验的OverwriteModelError
。
我会在您的 IDE 中查找并查看您需要该模型的所有位置。
【讨论】:
以上是关于编译后无法覆盖“用户”模型。解决后我得到“用户”未定义的主要内容,如果未能解决你的问题,请参考以下文章
Mongoose/NextJS - 模型未定义/编译后无法覆盖模型
User.find 不是函数,一旦编译就无法覆盖“用户”模型