Pranav Sharma
Pranav Sharma

Reputation: 59

why do i keep getting OverwriteModelError?

I get the following error when I start the server:

throw new _mongoose.Error.OverwriteModelError(name); ^ OverwriteModelError: Cannot overwrite User model once compiled. at new OverwriteModelError (/home/pranav/exercise-tracker/mern-exercise-tracker/backend/node_modules/mongoose/lib/error/overwriteModel.js:20:11)

my user.model.js file

const mongoose = require("mongoose");
const Schema = mongoose.Schema;

const userSchema = new Schema(
  {
    username: {
      type: String,
      required: true,
      unique: true,
      trim: true,
      minlength: 3
    }
  },
  {
    timestamps: true
  }
);

const User = mongoose.model("User", userSchema);
module.exports = User;

My users.js

const router = require("express").Router();
let User = require("../models/user.model");

router.route("/").get((req, res) => {
  User.find()
    .then(users => res.json(users))
    .catch(err => res.status(400).json("Error: " + err));
});

router.route("/add").post((req, res) => {
  const username = req.body.username;
  const newUser = new User({ username });

  newUser
    .save()
    .then(() => res.json("User added!"))
    .catch(err => res.status(400).json("Error: " + err));
});

module.exports = router;

server.js

const express = require('express');
const cors = require('cors');
const mongoose = require('mongoose');

require('dotenv').config();

const app = express();
const port = process.env.PORT || 5000;
app.use(cors);
app.use(express.json());
const uri = process.env.ATLAS_URI;

mongoose.connect(uri, { useNewUrlParser: true, useCreateIndex: true, useUnifiedTopology: true });
const connection = mongoose.connection;

connection.once('open', () => {
    console.log("MongoDB connection established");
})

const exercisesRouter = require('./routes/exercises');
const usersRouter = require('./routes/users');

app.use('/exercises', exercisesRouter);
app.use('/users', usersRouter);

app.listen(port, () => {
    console.log('Server is running on port : ' + port);
})

Upvotes: 1

Views: 486

Answers (1)

Valentin
Valentin

Reputation: 1501

Replace

const User = mongoose.model("User", userSchema);

with

const User = mongoose.models['User'] || mongoose.model("User", userSchema);

When your code is running user.model.js is probably being called again, thus calling the initial definition.

Note the models being used in the OR. That method returns an object containing all defined models. It can also be written as mongoose.models.User.

Upvotes: 2

Related Questions