작성
·
47
0
export const User = mongoose.models.User || mongoose.model("User", userSchema)
import mongoose from "mongoose";
interface Connection {
isConnected?: boolean; // 선택적으로 isConnected 필드
}
const connection: Connection = {
isConnected: false, // 기본값 false로 설정
};
export const connectToDB = async (): Promise<void> => {
try {
if (connection.isConnected) return; // 이미 연결된 경우
const db = await mongoose.connect(process.env.MONGODB_URI as string);
connection.isConnected = db.connections[0].readyState === 1;
console.log("Connected to MongoDB:",db.connections[0].readyState );
} catch (error) {
console.error("Error connecting to MongoDB:", error);
throw new Error("Failed to connect to MongoDB");
}
};
맨 위는 models에 스키마 정의 해놓은 부분을 가져온거구요
밑에는 DB에 연결하는 connectToDB입니다.
import {redirect} from "next/navigation";
import {auth} from "@/server/auth";
import {getRoleStatus} from "@/server/actions/get-role-status";
import {User} from "@/lib/models";
import AnalyticsCard from "../../components/dashboard/analytics-card";
import TeamList from "../../components/teams/team-list";
import {z} from "zod";
import {TeamSchema} from "@/types/team-schema";
import {connectToDB} from "@/lib/utils";
export type Team = z.infer<typeof TeamSchema>;
export default async function Page() {
connectToDB()
const team = await User.find();
const plainTeam = team.map((member) => {
const memberObj = member.toObject(); // Convert to plain object
return {
_id: memberObj._id.toString(), // Convert ObjectId to string
name: memberObj.name,
username: memberObj.username,
email: memberObj.email,
createdAt: memberObj.createdAt ? memberObj.createdAt.toISOString() : null, // Convert Date to ISO string
updatedAt: memberObj.updatedAt ? memberObj.updatedAt.toISOString() : null, // Convert Date to ISO string
isAdmin: memberObj.isAdmin !== undefined ? memberObj.isAdmin : false, // Provide default
isApproved:
memberObj.isApproved !== undefined ? memberObj.isApproved : false, // Provide default
isPending:
memberObj.isPending !== undefined ? memberObj.isPending : false, // Provide default
location: memberObj.location || "N/A", // Provide default
// Add other fields as necessary
};
});
console.log("Plain Team Data:", plainTeam);
const session = await auth();
const role = await getRoleStatus();
if (!session) {
redirect("/");
}
return (
<AnalyticsCard title="Team" subTitle="Approved Member and Pending Member">
<div className="p-6">
<TeamList data={plainTeam} role={role!} />
</div>
</AnalyticsCard>
);
}
이건 team페이지인데 여기가 로드가 안되네요 값들은 다 잘불러와지는데..
모델도 다 잘불러와지는 상태입니다.
챗지피티가 하라는것도 다 했는데도 안되네요 도와주세요
이건 models.tsx입니다
import mongoose from "mongoose";
const userSchema = new mongoose.Schema(
{
name: {type: String, required: true, unique: true},
username: {type: String},
hashedPassword: {type: String},
email: {type: String, required: true, unique: true},
image: {type: String},
orders: {type: Number},
revenue: {type: Number},
isAdmin: {type: Boolean, default: false}, // Ensure this field exists
isApproved: {type: Boolean, default: false}, // Ensure this field exists
isPending: {type: Boolean, default: false}, // Ensure this field exists
location: {type: String}, // Ensure this field exists
},
{timestamps: true}
);
const productSchema = new mongoose.Schema({
isAdmin: {
type: Boolean,
},
name: {
type: String,
},
image: {
type: String,
},
isApproved: {
type: Boolean,
},
email: {
type: String,
},
id: {
type: String,
},
});
export const User = mongoose.models.User || mongoose.model("User", userSchema);
console.log("User model:", userSchema);
export const Product =
mongoose.models.Product || mongoose.model("Product", productSchema);
이건 teams-actions 파일입니다.
"use client";
import {revalidatePath} from "next/cache";
import {sendApprovalEmail, sendDeclineEmail} from "./email";
import {actionClient} from "@/lib/safe-action";
import {TeamSchema} from "@/types/team-schema";
import {User} from "@/lib/models";
import {connectToDB} from "@/lib/utils";
export const approveTeamMember = actionClient
.schema(TeamSchema)
.action(async ({parsedInput: {email, name}}) => {
try {
await connectToDB();
await User.findOneAndUpdate({email: email}, {set 필요 없음
await revalidatePath("/", "layout"); // 비동기 함수, await 필요
await sendDeclineEmail(name!, email);
} catch (error) {
console.error("Error declining team member:", error);
throw error;
}
});
export const updateTeamMember = actionClient
.schema(TeamSchema)
.action(async ({parsedInput: {email, isAdmin}}) => {
try {
await connectToDB();
await User.updateMany({email: email}, {$set: {isAdmin: isAdmin}});
await revalidatePath("/", "layout"); // 비동기 함수, await 필요
} catch (error) {
console.error("Error updating team member:", error);
throw error;
}
});
export const deleteTeamMember = actionClient
.schema(TeamSchema)
.action(async ({parsedInput: {email}}) => {
try {
await connectToDB();
await User.findOneAndDelete({email: email});
await revalidatePath("/", "layout"); // 비동기 함수, await 필요
} catch (error) {
console.error("Error deleting team member:", error);
throw error;
}
});
혹시나 문제가 있을것같은 부분있으면 답변 부탁드립니다!
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
정채림님, 제공해주신 코드와 설명을 토대로 문제를 분석해봤습니다. TypeError: Cannot read properties of undefined (reading 'User')
에러는 보통 User
모델이 정상적으로 불러와지지 않을 때 발생합니다. 몇 가지 사항을 확인해보시면 문제 해결에 도움이 될 것 같습니다:
모델 정의와 가져오기: models.tsx
파일과 Page
컴포넌트의 User
불러오는 부분을 정확히 확인하십시오. models.tsx
에는 User
모델이 제대로 정의되어 있고, 이를 명확히 Page
컴포넌트에서 임포트하고 있는지 확인하세요.
몽고DB 연결 상태: connectToDB
함수가 제대로 호출되고, 데이터베이스에 정상적으로 연결되었는지 확인하세요. 연결되지 않았다면 User
모델을 찾을 수 없습니다.
환경 변수: process.env.MONGODB_URI
가 올바르게 설정되었는지 확인하세요. 설정이 잘못되었거나, 누락된 경우 데이터베이스에 연결할 수 없습니다.
모델 정의 오류: 스키마 정의가 제대로 되어 있는지 다시 한번 살펴보세요. userSchema
에 필수 필드들과 옵션들이 잘 설정되어 있는지 확인하세요.
아래에 일부 코드 수정 및 점검할 수 있는 예시를 첨부합니다.
import mongoose from "mongoose";
const userSchema = new mongoose.Schema(
{
name: {type: String, required: true, unique: true},
username: {type: String, required: true}, // Ensure all mandatory fields are properly defined
hashedPassword: {type: String, required: true},
email: {type: String, required: true, unique: true},
image: {type: String},
orders: {type: Number},
revenue: {type: Number},
isAdmin: {type: Boolean, default: false},
isApproved: {type: Boolean, default: false},
isPending: {type: Boolean, default: false},
location: {type: String},
},
{timestamps: true}
);
export const User = mongoose.models.User || mongoose.model("User", userSchema);
console.log("User model initialized:", User); // Added log to check the model initialization
Page
컴포넌트에서 데이터베이스 초기 연결을 확인합니다:
import { connectToDB } from "@/lib/utils";
import { User } from "@/lib/models";
// 추가 로그로 데이터베이스 연결 상태를 확인합니다.
export default async function Page() {
await connectToDB();
if (!connection.isConnected) {
throw new Error("Database not connected");
}
const team = await User.find();
// ...
console.log("Plain Team Data:", plainTeam);
}
몽고DB 연결 상태를 확인하는 추가 로그를 추가하면 연결 문제를 더 빠르게 파악할 수 있습니다. 문제 해결에 도움이 되길 바랍니다. 추가적인 질문이 있으시면 언제든지 문의해주세요!
참고: Spring Boot MongoDB Documentation
감사합니다.