我正在构建一个简单的博客应用程序来学习使用 next 和 mongoose。现在我收到错误“TypeError: mongoose__WEBPACK_IMPORTED_MODULE_0__.models is undefined”。
我有一个博客文章模型。 postModel.js 看起来像这样:
import { Schema, models, model } from "mongoose"
const postSchema = new Schema({
title: { type: String, required: true },
content: { type: String, required: true },
author: { type: String, required: true },
image: { type: String },
})
const Post = models.Post || model("Post", postSchema)
export default Post
我的 index.js 看起来像这样:
import { Header } from "../components/Header"
import { BlogPosts } from "../components/BlogPosts"
import BlogPostForm from "../components/BlogPostForm"
import { useUser } from "@auth0/nextjs-auth0/client"
import Post from "../models/postModel"
import connectMongo from "../utils/connectMongo"
export default function Home({ posts }) {
const { user } = useUser()
return (
<div className="container">
<Header />
<div className="blog">
<BlogPosts posts={posts} />
{user && <BlogPostForm />}
</div>
</div>
)
}
export const getServerSideProps = async () => {
try {
console.log("CONNECTING SERVERSIDE")
await connectMongo()
console.log("CONNECTED SERVERSIDE")
const posts = await Post.find()
console.log("TEEEST")
// Post.watch().on("change", () => console.log("NU JÄVLAR!!"))
console.log("TEEEST")
return {
props: {
posts: JSON.parse(JSON.stringify(posts)),
},
}
} catch (error) {
console.log(error)
}
}
像这样,应用程序可以正常运行。 但是,我想监听 mongodb 中的更改并重新呈现我博客中的 blogpost 组件,这样当我添加帖子时,帖子列表会立即重新呈现。
当我像这样添加 useEffect 时:
useEffect(() => {
Post.watch().on("change", () => {
console.log("UPDATE")
})
}, [])
我刚收到错误“TypeError: mongoose__WEBPACK_IMPORTED_MODULE_0__.models is undefined”。
在构建应用程序时,这个错误一直困扰着我——导入或导出似乎有问题——但在那种情况下,我不明白为什么当我尝试时它突然给我这个错误添加一个 useEffect 而不是之前?
我试过来回更改导入和导出,但没有任何效果。请帮忙!
我相信这与未连接到我的 mongodb 有关? 我试过来回更改我的出口和进口。我已经确保我没有在任何未使用它的文件中导入 Post(之前导致了同样的错误)。我也向 ChatGPT 寻求帮助,但无济于事。我遵循了我的代码(至少在 postModel.js 中)相同的教程,因此该文件应该没有任何问题。
编辑:
这是我的 connectDB 文件:
import mongoose from "mongoose"
mongoose.set("strictQuery", true)
const connectMongo = async () => mongoose.connect(process.env.MONGO_URI)
export default connectMongo
有时,错误消息可能会产生误导。一种查看问题的方法,因为未导入 mongoose 的对象(或引用);
import mongoose from "mongoose"
,因此未定义。
看待这个问题或事实的另一种方式是......这也是一个问题,因为 mongoose 和 webpack 是如何相互作用的。
当你的代码被执行时,你会遇到这里的错误
mongoose.connect(process.env.MONGO_URI)
因为“猫鼬”是一个未定义的对象。
您可以通过简单地将猫鼬版本更改为旧版本来解决问题。运行一些测试后,可以解决问题的版本是
"mongoose": "^5.10.14"
友情提醒,即使是在“全栈”框架下开发,也要尽量保持前后端分离。这可以解决未来出现的问题。