You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Mongoose中exists()函数报错求助:创建Company模型时函数不存在

问题排查与解决

错误1:TypeError: companyData.exists is not a function

问题原因

exists()是Mongoose模型(Model)的静态方法,仅能通过模型本身调用,不能通过模型实例使用。你代码中var companyData = new company()创建的是模型实例,实例不存在exists方法;同时需确保业务代码中company变量是正确导入的Company模型。

修复后的业务代码

首先在业务文件顶部正确导入Company模型(路径根据实际项目结构调整):

const company = require('../../models/Company');

然后修改createCompany函数:

module.exports.createCompany = (userDetails) => {
  return new Promise(function myFn(resolve, reject) {
    userDetails.name = userDetails.name.trim();

    // 直接通过模型调用exists方法,而非实例
    company.exists(
      { name: userDetails.name },
      function returnData(error, result) {
        if (error) {
          reject(error); // 返回错误信息,便于调试
        } else {
          if (result) {
            reject(new Error('公司名称已存在')); // 明确错误原因
          } else {
            var companyData = new company();
            companyData.name = userDetails.name;
            companyData.save(function resultHandle(error, result) {
              if (error) {
                reject(error);
              } else {
                resolve(result); // 返回创建后的文档,比布尔值更实用
              }
            });
          }
        }
      }
    );
  });
};

错误2:Error: Route.post() requires a callback function but got a [object Undefined]

问题原因

该错误说明你在Express路由中定义POST请求时,传入的处理函数为undefined,常见原因包括:

  • 控制器文件未正确导出createCompany处理函数
  • 路由文件导入控制器函数时路径错误
  • 路由调用post方法时写错了函数名

修复步骤

  1. 检查控制器文件(如userController.js),确保正确导出处理函数:
const companyService = require('./userService');

exports.createCompany = async (req, res) => {
  try {
    const result = await companyService.createCompany(req.body);
    res.status(201).json({ success: true, data: result });
  } catch (error) {
    res.status(400).json({ success: false, message: error.message });
  }
};
  1. 检查路由文件(如routes.js),确保正确导入并使用控制器函数:
const express = require('express');
const router = express.Router();
const userController = require('../src/user/userController'); // 确保路径正确

// 确认此处使用的是存在的控制器函数
router.post('/companies', userController.createCompany);

module.exports = router;

额外优化建议

  • 在Company模型的name字段添加唯一索引,从数据库层面确保名称不重复,避免并发场景下的重复创建问题:
var companySchema = mongoose.Schema({
  _id: mongoose.Schema.Types.ObjectId, // 建议使用Mongoose默认的_id,无需手动定义id字段
  name:{
    type: String,
    required: true,
    unique: true // 添加唯一约束
  }
});
  • 使用async/await替代嵌套回调,让代码更简洁易读:
module.exports.createCompany = async (userDetails) => {
  userDetails.name = userDetails.name.trim();
  const exists = await company.exists({ name: userDetails.name });
  if (exists) {
    throw new Error('公司名称已存在');
  }
  const companyData = new company({ name: userDetails.name });
  return await companyData.save();
};

内容的提问来源于stack exchange,提问作者Ashton Sequeira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 07:55:18