【问题标题】:"Cannot overwrite model once compiled" Next.js and Mongoose Schemas“编译后无法覆盖模型” Next.js 和 Mongoose Schemas
【发布时间】:2021-03-01 21:08:06
【问题描述】:

第一次使用 Next.js,我正在尝试使用 MongoDB 数据库、模式模型和路由来实现 Node.js 服务器。

我不确定我做错了什么,因为我尝试了很多组合,正如您在我的代码中的 cmets 中看到的那样。我需要使用模型,但出现以下错误:

“OverwriteModelError: 编译后无法覆盖termscon 模型。”

服务器/模型/TermsCon.js:

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

// Create Schema
const TermsConSchema = new Schema({
    _id: {
        type: String,
        required: true,
        default: "1"
    },
    text: {
        type: String,
        required: true,
        default: "Lorem Ipsum"
    }
});

// const TermsCon = mongoose.model.termscon || mongoose.model('termscon', TermsConSchema);    
// module.exports = TermsCon;

// module.exports = mongoose.model('termscon', TermsConSchema);
// export default mongoose.model.TermsCon || mongoose.model('termscon', TermsConSchema)
module.exports = TermsCon = mongoose.model('termscon', TermsConSchema);

server/routes/api/termscons.js:

const express = require('express')
const mongoose = require('mongoose');
const router = express.Router()

const TermsCon = require('../../models/TermsCon')
// const TermsCon = mongoose.model('termscon')

router.get('/', (req, res) => {
    TermsCon.find()
    .then(tc => {
        res.json(tc)
    })
});

module.exports = router;

服务器/index.js:

const express = require('express')
const next = require('next')
const mongoose = require('mongoose')

const port = process.env.PORT || 3000
const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()

app.prepare().then(() => {
    
    mongoose
    .connect(process.env.MONGODB_URI,
        {
            useNewUrlParser: true,
            useUnifiedTopology: true,
            useNewUrlParser: true,
            useUnifiedTopology: true,
            useCreateIndex: true
        }
    )
    .then(() => console.log('MongoDB Connected...'))
    .catch(err => console.log(err));    

    const server = express()

    server.use("/api/termscons", require("./routes/api/termscons"))

    server.get('*', (req, res) => {
        return handle(req, res)
    })

    server.listen(port, (err) => {
        if (err) throw err
        console.log(`Server started on port ${port}`)
    })
})

pages/index.js:

import axios from 'axios'
import { useState, useEffect } from 'react'

export default function Home() {     

    const [ tc, setTc ] = useState()
    
      useEffect(() => {
        axios.get('/api/termscons')
          .then(res => {
            setTc(res.data)
          })
          .catch(err =>console.log("ERR: ", err))    
      }, [])
      
      return (
            <div>
              {tc ?
                <p>{tc}</p>
              : null}
            </div>
      )
    }

我导出架构的方式有问题吗?使用我连接到 MongoDB 的方式?路线?页面?

任何想法将不胜感激!谢谢!

【问题讨论】:

  • 您遇到过解决方法吗?我想知道自己
  • Ayyoub,是的,我刚刚在下面发布了答案。我不再使用自定义服务器,所以我做了一些改动,希望对您有所帮助。
  • 在我的情况下,我必须使用自定义服务器,我通过 github 上的临时修复来解决它。希望它可以帮助那里的人。 github.com/vercel/next.js/blob/canary/examples/…
  • 我从同一个例子开始,最终改变了一切。如您所见,导出模型的方法相同。

标签: node.js mongodb express next.js mongoose-schema


【解决方案1】:

所以我改变了结构:

  1. 我放弃了创建自定义服务器,因为它对我的 Next.js 应用程序没有任何帮助。 所以我不再有任何 server/index.js 或 server/routes/api。实际上,根本没有“服务器”文件夹。我只是单独创建了一个 mongodb 连接来帮助我连接到我的数据库,我在每个服务器 api 调用中调用它,如下所示:

utils/dbConnect.js:

import mongoose from 'mongoose'

async function dbConnect() {
  await mongoose.connect(process.env.MONGODB_URI, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    useFindAndModify: false,
  })
}

export default dbConnect
  1. 由于我不再有自定义服务器,因此我也没有服务器/路由/api。所以对于 api 路由,我使用默认的 next.js api 文件夹:

pages/api/termscons.js:

import dbConnect from '../../../utils/dbConnect'
import TermsCon from '../../../models/TermsCon'

export default async function handler(req, res) {
  await dbConnect()

  switch (req.method) {
    case 'GET':
      try {
        const tc = await TermsCon.find()
        res.status(200).json(tc)
      } catch (error) {
        res.status(400).json({ itemnotfound: "No item found" })
      }
      break
    default:
      res.status(400).json({ itemnotfound: "No item found" })
      break
  }
}
  1. 最后,我的应用主文件夹中有一个包含所有模型的文件夹:

模型/TermsCon.js:

import mongoose from 'mongoose'

const TermsConSchema = new mongoose.Schema({
    _id: {
        type: String,
        required: true,
        default: "1"
    },
    text: {
        type: String,
        required: true,
        default: "Lorem Ipsum"
    }
});

export default mongoose.models.TermsCon || mongoose.model('termscon', TermsConSchema);

【讨论】:

  • 模型中使用的导出方式对我很有用
猜你喜欢
  • 2013-10-03
  • 2015-04-25
  • 2020-05-08
  • 2021-05-18
  • 2021-07-06
  • 2020-10-07
  • 2019-01-13
  • 2014-08-03
相关资源
最近更新 更多