编译后无法覆盖“用户”模型。解决后我得到“用户”未定义

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 - 模型未定义/编译后无法覆盖模型

编译节点 js 后无法覆盖“用户”模型

编译节点 js 后无法覆盖“用户”模型

User.find 不是函数,一旦编译就无法覆盖“用户”模型

一旦编译了模型“”,就无法覆盖“用户”模型(或者我已经监督了一些事情)[重复]

一旦编译了模型“”,就无法覆盖“用户”模型(或者我已经监督了一些事情)[重复]