mongoose 抛出 Schema 尚未在 next.js 中注册的错误

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

我刚刚开始使用 next.js,每当我调用引用另一个文档的 api 时,猫鼬都会向我抛出一个错误,指出“尚未为模型注册架构”。

这是我的代码。

型号

Task.js

const mongoose = require("mongoose");

const TaskModel = () => {
  const schema = mongoose.Schema;

  const taskSchema = new schema(
    {
      taskName: {
        type: String,
        required: true,
      },
      empId: {
        type: schema.Types.ObjectId,
        ref: "Employee",
        required: true,
      },
      adminId: {
        type: schema.Types.ObjectId,
        ref: "Admin",
        required: true,
      },
      deptId: {
        type: schema.Types.ObjectId,
        ref: "Department",
        required: true,
      },
      deadline: {
        type: String,
      },
      status: {
        type: Boolean,
        default: false,
      },
      completedDate: {
        type: String,
        default: "",
      },
      completionStatus: {
        type: String,
        default: "Assigned",
      },
    },
    { timestamps: true }
  );

  return mongoose.models.Task ?? mongoose.model("Task", taskSchema);
};

export default TaskModel;

employee.js

const mongoose = require("mongoose");

const EmployeeModel = () => {
  const schema = mongoose.Schema;

  const employeeSchema = new schema({
    empName: {
      type: String,
      required: true,
    },
    empEmail: {
      type: String,
      required: true,
    },
    password: {
      type: String,
      required: true,
    },
    department: {
      type: schema.Types.ObjectId,
      ref: "Department",
      required: true,
      // type:String
    },
    document: {
      type: String,
    },
    loginStatus: {
      type: Boolean,
      default: false,
    },
  });

  return mongoose.models.Employee ?? mongoose.model("Employee", employeeSchema);
};

export default EmployeeModel;

db.js(用于将应用程序与mongoDB连接)

import mongoose from "mongoose";

import TestModel from "@/models/test";
import TaskModel from "@/models/task";
import AdminModel from "@/models/admin";
import EmployeeModel from "@/models/employee";
import DepartmentModel from "@/models/department";

if (mongoose.connection.readyState !== 1) {
  mongoose.connect(process.env.MONGO_URI);
}
mongoose.Promise = global.Promise;

export const db = {
  Test: TestModel,
  Task: TaskModel,
  Admin: AdminModel,
  Employee: EmployeeModel,
  Department: DepartmentModel,
};

getTask/route.jsx

import { db } from "@/helpers/db";

const Task = db.Task();
export const GET = async () => {
  try {
    const result = await Task.find().populate("empId");
    return Response.json(result);
  } catch (error) {
    console.log(error);
    return Response.json(error, { status: 422 });
  }
};

仪表板/page.jsx

"use client";
import style from "./page.module.css";
import Api from "./api";
import { useState, useEffect } from "react";

const Dashboard = () => {
  const [filterData, setFilterData] = useState("");
  const [finalData, setFinalData] = useState([]);
  useEffect(() => {
    const apiCall = async () => {
      const taskdata = await fetch("http://localhost:3000/api/task/getTask");
      const actualTaskData = await taskdata.json();
      console.log(actualTaskData);
      return actualTaskData;
    };
    const apires = apiCall();
    setFinalData(apires);
  }, []);
  return (
    <div style={{ margin: 0, padding: 0 }}>
      
    </div>
  );
};

export default Dashboard;

这是我的错误的图片

我附上文件夹结构供参考

mongodb mongoose next.js next.js13 mongoose-populate
1个回答
0
投票

看起来您必须注册

Employee
模型才能在
populate
方法中使用它。这是未经测试的,但请尝试:

const Task = db.Task();
const Employee = db.Employee(); //< Instantiate an Employee model
export const GET = async () => {
  try {
    const result = await Task.find().populate({ path: "empId", model: Employee });//< Explicitly use the Employee model here
    return Response.json(result);
  } catch (error) {
    console.log(error);
    return Response.json(error, { status: 422 });
  }
};
© www.soinside.com 2019 - 2024. All rights reserved.