#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:
Поэтому я изменил структуру:
- Я отказался от создания пользовательского сервера, поскольку это мне совсем не помогло в моей 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
- Поскольку у меня больше нет пользовательского сервера, у меня также нет сервера / маршрутов / 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
}
}
- В заключение, у меня есть папка со всеми моими моделями в главной папке моего приложения:
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. Способ экспорта, используемый в моделях, был полезен для меня