使用Mocha测试时出现findOne is not a function错误求助
解决"findOne is not a function"错误的排查方案
首先看你提供的代码,我发现了几个关键问题,来一步步帮你解决:
1. 模型定义的语法错误(最核心原因)
你的models/user.js里,sequelize.define的第三个参数(模型配置项)没被包裹在对象里,而且DataTypes的拼写也错了(写成了小写的Datatypes),这会直接导致模型无法正确初始化,最终db.user不是有效的Sequelize模型实例,自然没有findOne方法。
修复后的user.js代码:
'use strict'; module.exports=(sequelize, DataTypes)=>{ return sequelize.define('user',{ username:{ type:DataTypes.STRING, allowNull:false }, firstname:{ type:DataTypes.STRING, allowNull:false }, middlename:{ type:DataTypes.STRING, }, lastname:{ type:DataTypes.STRING, allowNull:false }, email:{ type:DataTypes.STRING, allowNull:false, isEmail:true }, password:{ type:DataTypes.STRING, allowNull:false }}, // 把配置项包裹在对象中 { timestamps:false, freezeTableName:true } ) }
2. 测试时确保模型完成初始化
你的models/index.js里的数据库连接是异步操作,但模块导出是同步的,测试可能在模型初始化完成前就执行了。可以给测试加前置钩子,保证所有准备工作完成后再跑测试:
修改后的测试文件:
const {expect}=require('chai') const{usernameExists}=require('../../services/user/user_db') const db = require('../../models/index.js') describe('user db tests',()=>{ // 所有测试前完成数据库连接和模型初始化 before(async () => { await db.sequelize.authenticate(); // 测试环境可选:同步模型(force: true会清空表,注意数据安全) // await db.sequelize.sync({ force: true }); }); // 测试结束后关闭数据库连接 after(async () => { await db.sequelize.close(); }); it('check whether username already exists',async()=>{ const check=await usernameExists('') expect(check).to.be.false expect(check===null).to.be.false expect(check===undefined).to.be.false }); });
3. 验证模型是否正确加载
可以在services/user/user_db.js里加一行日志,确认db.user的结构:
const db=require('../../models/index.js') console.log('Loaded user model:', db.user); // 查看输出是否为Sequelize模型实例 async function usernameExists(username){ const user= await db.user.findOne({ where:{username} }); if(user) return user return false } module.exports={usernameExists}
如果输出是undefined,那要检查models/index.js的模型加载逻辑:比如是否读取到了user.js文件,model.name是否正确为user。
其他排查点
- 确认测试环境的数据库配置和开发环境一致,能正常连接数据库
- 检查
models目录下的user.js是否符合加载规则(不是隐藏文件、后缀为.js、文件名没被排除)
内容的提问来源于stack exchange,提问作者anna
相关产品推荐
相关产品推荐

