【发布时间】: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