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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:12:41