【问题标题】:The 2nd parameter to `mongoose.model()` should be a schema, but it is a schema`mongoose.model()` 的第二个参数应该是一个模式,但它是一个模式
【发布时间】:2022-03-15 17:37:00
【问题描述】:

我正在尝试将用户添加到我在 MongoDB 中的用户集合中。我正在将猫鼬与 NodeJS 和 Typescript 一起使用,当我尝试运行该项目时,出现错误:

The 2nd parameter to `mongoose.model()` should be a schema or a POJO
at Mongoose.model

错误表明问题出在此文件中:

import { Router, Request, Response } from "express";
const UserType = require("../enums/UserType");
const UserSchema: mongoose.Schema = require("../schemas/UserSchema");
import mongoose from "mongoose";
import { v4 as uuidv4 } from "uuid";


export class UserRouter {
  router: Router;
  private userSchema = mongoose.model("UserSchema", UserSchema, "Users");

  constructor() {
    this.router = Router();
    this.init();
  }

  init() {
    this.router.post("/create", this.createUser);
  }

  //@ts-ignore
  async createUser(req: Request, res: Response) {
    const uid = uuidv4();
    const info = req.body;
    var user = new this.userSchema({
      uid: uid,
      username: info.username,
      password: info.password,
      type: UserType.User,
    });

    console.log(user);
  }
}

const userRouter = new UserRouter();
const router = userRouter.router;

export default router;

UserSchemamongoose.Schema<any> 类型,当用指针悬停在它上面时,会弹出:const UserSchema: mongoose.Schema<any>

这是我的用户架构:

import mongoose from "mongoose";

const UserSchema = new mongoose.Schema({
  uid: {
    type: String,
    required: true,
    unique: true,
  },
  username: {
    type: String,
    required: true,
    unique: true,
  },
  password: {
    type: String,
    required: true,
  },
  type: {
    type: Number,
    required: true,
  },
  createdAt: {
    type: Date,
    default: Date.now,
  },
});

module.exports = mongoose.model("UserSchema", UserSchema);

为什么我一直收到此错误消息,即使看起来错误不应该存在?

【问题讨论】:

  • 您导出的是模型,而不是 UserSchema 文件中的架构:module.exports = mongoose.model("UserSchema", UserSchema)
  • @CuongLeNgoc 谢谢,我应该如何导出这个?因为它看起来确实像我在 UserSchema 中执行 gt mongoose.Schema
  • 您可以更改您的要求:const UserSchema = require("../schemas/UserSchema"); 然后使用 UserSchema 而不是您的 userSchema
  • 将您的 UserSchema 文件重命名为 User 然后 const User = require("../schemas/User"); 可能会更好,因为您导出的是模型,而不是架构。
  • @CuongLeNgoc 谢谢,但我有一个 User 类,所以我想这会令人困惑。我编写 User 类的目的是只向用户发送相关信息(例如,不是密码和 createdAt),我是否走在正确的轨道上?

标签: node.js mongodb mongoose


【解决方案1】:
import mongoose from 'mongoose';
const { Schema } = mongoose;

const blogSchema = new Schema

const UserSchema = new mongoose.Schema // delete new......

【讨论】:

  • 请简要描述您的答案如何解决问题。谢谢!
  • 如果你使用 import 而不是 require,我认为 type:module 是 config... module.exports = mongoose.model("UserSchema", UserSchema);你需要通过 const User = mongoose.model("User", userSchema);导出默认用户;你可以删除const UserSchema= new mongoose.Schema并写const userSchema = mongoose.Schema
【解决方案2】:

尝试检查导出文件的名称:

module.exports = mongoose.model("User", UserSchema);
  1. 参数用户
  2. 参数:用户架构

【讨论】:

    【解决方案3】:

    您收到此错误的原因是您在代码中以递归方式声明了猫鼬模型:mongoose.model(UserSchema,mongoose.model(),"Users")。您应该导出 UserSchema 而不是创建架构 model 并导出它。您的代码应如下所示: module.exports.UserSchema = UserSchema; 在另一个模块中,您可以导入架构: const {UserSchema} = require("../schemas/UserSchema"); 并最终在 UserRouter 类中创建模式的新模型: private userSchema = mongoose.model("UserSchema", UserSchema);

    如果为同一架构定义两次mongoose.model(),可能会出现相同的错误:

    【讨论】:

      猜你喜欢
      • 2021-03-15
      • 2015-08-08
      • 1970-01-01
      • 2020-10-07
      • 1970-01-01
      • 2017-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多