Mongoose, Next.JS OverwriteModelError: Cannot overwrite model once compiled

Viewed 254

I am trying to integrate mongoose and apollo with Next.js I wrote this wrapper around apollo server:

import mongoose from "mongoose"
const {logger} = require("../middleware/logger");


const connect = async () => {
    logger.info("Connecting to DB...");
    await mongoose
        .connect(process.env.MONGO_URI, {
            useNewUrlParser: true,
            useFindAndModify: false,
            useUnifiedTopology: true
        }).then(() => logger.info(`Mongo running at ${process.env.MONGO_URI}`))
        .catch(err => logger.error(err));
}

const connectDB = (handler) => async (req, res) => {
    if (mongoose.connections[0].readyState !== 1) {
        await connect();
    }
    return handler(req, res);
}

const db = mongoose.connection;
db.once('ready', () => logger.info(`Connected to mongo on ${process.env.MONGO_URI}`));

export default connectDB;

In this model in separate file:

const mongoose = require('mongoose');
const {Schema} = mongoose;

const CustomerSchema = new Schema({
    name: {
        type: String,
        required: [true, 'Customer name is required'],
        unique: true,
        trim: true,
    },
    createdAt: {
        type: Date,
        default: Date.now
    }
}, {
    toJSON: {
        transform: function (doc, ret) {
            ret._id = ret._id.toString();
            delete ret.__v
        }
    }
});

module.exports = mongoose.model('Customer', CustomerSchema);

My apollo server looks like this now:

import {ApolloServer, gql} from "apollo-server-micro";
import connectDB from "../../middleware/db-middleware";
const _Customer = require("../../db/models/Customer");

const typeDefs = gql`

    type Customer {
        id: ID!
        name: String!
        createdAt: String
    }

    type Query {
        hello: String!
    }
    
    type NewCustomerResponse {
        success: Boolean!
        message: String
    }

    type Mutation {
        addCustomer(name: String!): NewCustomerResponse!
    }
`;

const resolvers = {
    Mutation: {
        addCustomer: async (parent, {name}, context, info) => {
            await _Customer.create({name});
            return {success: true, message: "Sample message"};
        }
    }
};

const apolloServer = new ApolloServer({
    typeDefs,
    resolvers,
    context: () => ({}),
});

export default connectDB(apolloServer.createHandler({path: "/api/gql"}));

First run works ok, but when I modify anything, and next.js auto-recompiles source files, it throws this error:

OverwriteModelError: Cannot overwrite `Customer` model once compiled.

Does anyone knows what am I doing wrong and how to resolve this issue?

0 Answers
Related