使用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接口交互
- 后端编写查询接口:在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;
- 前端调用后端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
相关产品推荐
相关产品推荐

