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方法时写错了函数名
修复步骤
- 检查控制器文件(如
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 }); } };
- 检查路由文件(如
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
相关产品推荐
相关产品推荐

