我正在尝试使用 NextJS 构建一个简单的 Web 应用程序,并尝试将 Mongoose 纳入我的数据库操作。
我已经阅读了无数 StackOverflow 帖子,但他们的解决方案似乎都不起作用。
所以我的 NextJS 项目的结构是这样的:
我有我的
app/page.tsx
。由于我有很多依赖于窗口大小的组件,因此我使用 App
渲染
{ssr: false}
组件
'use client';
import React from 'react';
import { ChakraProvider } from "@chakra-ui/react";
import dynamic from 'next/dynamic';
const App = dynamic(() => import('../components/App'), { ssr: false })
export default function Home() {
return (
<main>
<ChakraProvider>
<App />
</ChakraProvider>
</main>
);
}
我的应用程序中的一个子组件是
components/Game.tsx
,如下所示。 (这里的Clue
是基本类型)。
import { Clue } from "../types";
import { getDailyClue } from "../api/ClueAPI";
import { useEffect, useState } from "react";
const Game = (props: {color: string}) => {
const [clue, setClue] = useState<Clue>();
useEffect(() => {
getDailyClue().then((clue) => setClue(clue));
console.log(clue);
}, [clue]);
return (
<> Stuff </>
);
}
export default Game;
有趣的部分是,
getDailyClue
是我需要连接到我的 MongoDB 数据库并进行查询的地方。
第一个是
api/DBApi.ts
,其中包含连接到 Mongo 的代码。
'use server';
import mongoose from 'mongoose';
export const connectDB = async () => {
try {
await mongoose.connect(process.env.MONGO_URI);
console.log('Connected to MongoDB');
} catch (error) {
console.error(error);
}
}
我有我的
api/clue.ts
,它可以创建模型。
import mongoose from 'mongoose';
const clueSchema = new mongoose.Schema({
rowid: Number,
clue: String,
...
});
export default mongoose.models.ClueModel || mongoose.model('Clue', clueSchema);
最后,我有在
api/ClueAPI.ts
中获取数据的代码
'use server';
import { Clue } from '../types';
import { connectDB } from './DBAPI';
import ClueModel from './clue';
export const getDailyClue = async (): Promise<Clue> => {
await connectDB();
const randomClue = await ClueModel.find([
{
$match: {
date_used: {
$lte: new Date('2000-01-01'),
}
}
}
]);
return randomClue[0];
};
我的理解是,当我尝试从猫鼬获取数据时发生错误。我对 NextJS 相当陌生,并试图通过我正在构建的这个小项目奠定基础。
非常感谢任何帮助,谢谢!
我尝试了更多的东西,看起来我的
api/clue.ts
中的这些改变起作用了:
import mongoose from 'mongoose';
const clueSchema = new mongoose.Schema({
rowid: Number,
clue: String,
...
});
const getModel = () => {
return mongoose.model('Clue', clueSchema);
}
const ClueModel = mongoose.models.Clue || getModel();
export default ClueModel;
我想主要的修复方法是使用
mongoose.models.Clue
而不是 mongoose.models.ClueModel.