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

使用Mongoose查询集合时遇find()不是函数错误(Uncaught TypeError)

解决Mongoose "find() is not a function" 错误

问题场景

尝试在前端函数中使用Mongoose从集合查询数据时,触发Uncaught TypeError: e.find is not a function错误。相关代码如下:

前端引入模型代码

const resModel = require('../Backend/ResourcesModel')

前端查询函数

const getResources = () => {
    const cookie = document.cookie;
    const token = cookie && cookie.split('=')[1];
    const decode = JSON.parse(Buffer.from(token.split('.')[1], 'base64'));
    const para = {UserId:decode.user_id};
    console.log(para);
    resModel.find(para)
    .select('Food Marble Gold Solfour')
    .then(result => console.log(result))
}

Mongoose Model代码

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const ResourcesTemple = new Schema({
    UserId: {
        type: mongoose.Schema.Types.ObjectId,
        ref: 'User',
        required: true
    },
    Gold: {
        type: String,
        required: true
    },
    Solfour: {
        type: String,
        required: true
    },
    Marble: {
        type: String,
        required: true
    },
    Food: {
        type: String,
        required: true
    }
}, {versionKey: false});
const Resources = mongoose.model('Resources', ResourcesTemple);
module.exports = Resources;

错误信息

Uncaught TypeError: e.find is not a function

错误原因

  • 前端直接调用后端Mongoose模型:Mongoose是Node.js专属的后端数据库操作库,无法在浏览器环境中运行。你直接在前端代码里引入后端模型文件,导致resModel没有被正确初始化为Mongoose模型实例,自然不存在find()方法。
  • 场景逻辑错误:前端代码不应该直接操作数据库模型,这违背了前后端分离的架构原则,同时会带来数据安全风险。

解决方法

正确架构方案:前后端通过API接口交互

  1. 后端编写查询接口:在Node.js后端创建API接口,负责处理数据库查询逻辑:
// 后端路由示例(如 routes/resources.js)
const express = require('express');
const router = express.Router();
const resModel = require('../Backend/ResourcesModel');

// 建议用JWT中间件解析验证用户身份,避免前端直接处理令牌
router.get('/user-resources', async (req, res) => {
    try {
        // 从后端解析的用户信息中获取ID
        const userId = req.user.id;
        const resources = await resModel.find({UserId: userId})
                                        .select('Food Marble Gold Solfour');
        res.json(resources);
    } catch (err) {
        res.status(500).json({error: err.message});
    }
});

module.exports = router;
  1. 前端调用后端API:前端通过HTTP请求获取数据,不再直接操作Mongoose模型:
const getResources = async () => {
    try {
        const token = document.cookie.split('=')[1];
        const response = await fetch('/api/user-resources', {
            method: 'GET',
            headers: {
                'Authorization': `Bearer ${token}`
            }
        });
        const result = await response.json();
        console.log(result);
    } catch (err) {
        console.error('获取资源失败:', err);
    }
}

额外注意事项

  • JWT安全处理:禁止在前端直接解码JWT并传递用户ID,必须将令牌发送到后端验证解析,防止篡改用户身份。
  • 环境隔离:Mongoose仅在Node.js后端环境使用,前端代码专注于UI交互和API调用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:35:22