如何在使用猫鼬时摆脱这个错误?

问题描述 投票:0回答:1

我正在构建一个简单的博客应用程序来学习使用 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
mongodb mongoose next.js next
1个回答
0
投票

有时,错误消息可能会产生误导。一种查看问题的方法,因为未导入 mongoose 的对象(或引用);

import mongoose from "mongoose"
,因此未定义。

看待这个问题或事实的另一种方式是......这也是一个问题,因为 mongoose 和 webpack 是如何相互作用的。

当你的代码被执行时,你会遇到这里的错误

mongoose.connect(process.env.MONGO_URI)
因为“猫鼬”是一个未定义的对象。

您可以通过简单地将猫鼬版本更改为旧版本来解决问题。运行一些测试后,可以解决问题的版本是

"mongoose": "^5.10.14"

友情提醒,即使是在“全栈”框架下开发,也要尽量保持前后端分离。这可以解决未来出现的问题。

参考资料:https://github.com/Automattic/mongoose/issues/5610.

© www.soinside.com 2019 - 2024. All rights reserved.