Node.js Mongoose,Next.JS OverwriteModeError:编译后无法覆盖模型
我正在尝试将mongoose和apollo与Next.js集成 我围绕阿波罗服务器写了这个包装:Node.js Mongoose,Next.JS OverwriteModeError:编译后无法覆盖模型,node.js,mongodb,mongoose,graphql,next.js,Node.js,Mongodb,Mongoose,Graphql,Next.js,我正在尝试将mongoose和apollo与Next.js集成 我围绕阿波罗服务器写了这个包装: import mongoose from "mongoose" const {logger} = require("../middleware/logger"); const connect = async () => { logger.info("Connecting to DB..."); await mong
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;
在此模型中,在单独的文件中:
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);
我的阿波罗服务器现在看起来像这样:
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"}));
第一次运行正常,但当我修改任何内容,并且next.js自动重新编译源文件时,它会抛出以下错误:
OverwriteModelError: Cannot overwrite `Customer` model once compiled.
有人知道我做错了什么以及如何解决这个问题吗?你找到解决方案了吗?是的,我必须像这样导出我的模型:
mongoose.models.Customer | mongoose.model('Customer',CustomerSchema)代码>