«Невозможно перезаписать модель после компиляции» Next.js и схемы Мангуста

#node.js #mongodb #express #next.js #mongoose-schema

#node.js #mongodb #экспресс #next.js #мангуст-схема

Вопрос:

При первом использовании Next.js , я пытаюсь реализовать Node.js сервер с базой данных MongoDB, моделями схем и маршрутами.

Я не уверен, что я делаю неправильно, поскольку я перепробовал много комбинаций, как вы можете видеть в комментариях к моему коду. Мне нужно использовать модели, но я получаю следующую ошибку:

«Ошибка перезаписи модели: невозможно перезаписать termscon модель после компиляции».

server/models/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;
  

server/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? Маршруты? Страницы?

Любая идея будет высоко оценена! Спасибо!

Комментарии:

1. Вы сталкивались с исправлением этого? Я сам удивляюсь

2. Айюб, да, я только что опубликовал ответ ниже. Я больше не использую пользовательский сервер, поэтому я немного изменил ситуацию, надеюсь, это вам поможет.

3. В моем случае я должен использовать пользовательский сервер, я нашел временное исправление для него на github. надеюсь, это кому-то поможет. github.com/vercel/next.js/blob/canary/examples /…

4. Я начал с того же примера, в итоге изменил ситуацию. Как вы можете видеть, существует тот же способ экспорта модели.

Ответ №1:

Поэтому я изменил структуру:

  1. Я отказался от создания пользовательского сервера, поскольку это мне совсем не помогло в моей Next.js приложение. Так что у меня их нет server/index.js больше или сервер / маршруты / api. На самом деле, папки «server» вообще нет. Я просто создал отдельное соединение 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. В заключение, у меня есть папка со всеми моими моделями в главной папке моего приложения:

models/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);
  

Комментарии:

1. Способ экспорта, используемый в моделях, был полезен для меня