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

MongoDB问题:同一文件内SessionModel.find()仅部分场景报错的原因与解决

SessionModel.find()抛出"not a function"错误的原因及解决办法

问题描述

我正在开发一个用MongoDB存储会话数据的项目,通过Mongoose定义了SessionModel表示数据库中的会话文档,并在sessionHandler.js中导出四个操作会话数据的函数。其他函数均可正常运行,但在storeArticleData()函数中调用SessionModel.find()获取所有会话文档时,抛出"SessionModel.find is not a function"错误,同一文件内其他函数使用SessionModel的方法却能正常工作。

SessionModel.js代码

import mongoose from "mongoose";

const sessionSchema = new mongoose.Schema({
  id: {
    type: String,
    required: true,
  },
  content: {
    type: String,
    required: true,
  },
  shop: {
    type: String,
    required: true,
  },
  articleData: { type: Object, required: true },
});

const SessionModel = mongoose.model("session", sessionSchema);

export default SessionModel;

sessionHandler.js简化代码

import { Session } from "@shopify/shopify-api";
import SessionModel from "./models/SessionModel.js";
import CryptoJS from "crypto-js";

const storeSession = async (session) => {
   await SessionModel.findOneAndUpdate(
    { id: session.id },
    {
      content: CryptoJS.AES.encrypt(
        JSON.stringify(session),
        process.env.ENCRYPTION_STRING
      ).toString(),
      shop: session.shop,
      articleData: {},
    },

    { upsert: true }
  );

  return true;
};

const storeArticleData = async (shopName, data) => {
  const doc = await SessionModel.find();
  // 上述代码报错:"SessionModel.find is not a function"
  // await SessionModel.findOneByIdAndUpdate(
  //   { id: "offline_" + shopName },
  //   {
  //     articleData: data,
  //   }
  // );
  return true;
};

const loadSession = async (id) => {
  // ...
};

const deleteSession = async (id) => {
  // ...
};

const sessionHandler = {
  storeSession,
  loadSession,
  deleteSession,
  storeArticleData,
};

export default sessionHandler;

原因分析

这个错误的核心是SessionModel对象上不存在find静态方法,可能的具体原因:

  • 模块导入异常:虽然代码中是默认导入,但如果文件路径错误、ES模块配置有问题,会导致SessionModel不是预期的Mongoose模型对象。
  • 变量被意外覆盖:在sessionHandler.js未展示的代码中,可能存在对SessionModel重新赋值的操作,让它不再指向Mongoose模型。
  • Mongoose初始化未完成:如果storeArticleData在Mongoose连接数据库完成前被调用,模型可能还未完全初始化,缺失静态方法。
  • 错误方法名的潜在影响:注释中的findOneByIdAndUpdate是错误的Mongoose方法名(正确为findByIdAndUpdate),若之前调试时错误调用导致模型对象异常,也可能引发问题。

解决办法

按以下步骤排查修复:

  1. 验证SessionModel类型:在storeArticleData开头添加日志,确认SessionModel的实际类型:
    const storeArticleData = async (shopName, data) => {
      console.log("SessionModel类型:", typeof SessionModel);
      console.log("SessionModel对象:", SessionModel);
      // 后续代码...
    };
    
    若输出不是function(Mongoose模型是构造函数),检查文件路径是否正确,确保SessionModel.js无语法错误。
  2. 检查变量覆盖情况:全局搜索sessionHandler.js中的SessionModel,确认没有其他代码对其重新赋值(比如SessionModel = xxx)。
  3. 确保Mongoose连接完成:在项目入口文件中等待数据库连接完成后再启动服务:
    import mongoose from "mongoose";
    
    async function startServer() {
      await mongoose.connect(process.env.MONGODB_URI);
      console.log("MongoDB连接成功");
      // 启动服务或加载其他模块
    }
    
    startServer();
    
  4. 修复错误方法名:把注释中的findOneByIdAndUpdate改为正确的findByIdAndUpdate,避免后续调试出现新错误。
  5. 更新Mongoose版本:如果使用旧版Mongoose,可能存在已知的模型静态方法问题,执行npm install mongoose@latest更新到最新稳定版。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 00:42:15