将Mongoose模型移至TS引用项目后出现缓冲超时问题求助
排查Mongoose查询缓冲超时问题的思路
针对你把模型移到TypeScript引用项目后出现的MongooseError: Operation amounttypes.find() buffering timed out after 10000ms错误,核心原因是模型没有关联到有效的数据库连接,下面是具体排查和解决步骤:
1. 优先解决Mongoose多实例问题
你主项目用的是mongoose@7.0.4,模型项目单独安装了mongoose@7.2.2,这会导致两个项目加载各自独立的Mongoose实例:
- 主项目建立的连接属于自己的Mongoose实例
- 模型项目的模型会绑定到自身实例的默认连接(这个连接根本没初始化)
- 最终查询时模型找不到可用连接,触发缓冲超时
解决方法:
修改shoppingcard-models的package.json,将mongoose改为peer依赖,让模型项目复用主项目的Mongoose实例:
{ // ...其他配置 "peerDependencies": { "mongoose": "^7.x" }, "devDependencies": { "mongoose": "^7.x" } }
然后重新安装主项目的依赖,确保模型项目不会单独安装mongoose。
2. 修正TypeScript项目引用的构建逻辑
主项目的tsconfig.json配置了项目引用,但build脚本只是tsc,没有触发关联项目的构建,可能导致模型项目的代码未被编译,加载时出现异常:
解决方法:
修改主项目package.json的build脚本:
"scripts": { // ...其他脚本 "build": "tsc --build" }
tsc --build会自动构建所有在references中声明的项目,确保模型项目的编译产物能被主项目正确加载。
3. 确保模型关联到主项目的数据库连接
如果模型在单独项目中直接定义为Mongoose模型,它会默认使用自身Mongoose实例的连接,而不是主项目的连接。可以改为导出Schema,由主项目用自己的Mongoose实例创建模型:
模型项目(shoppingcard-models):
// src/amounttype.ts import { Schema } from 'mongoose'; export const AmountTypeSchema = new Schema({ // 你的Schema定义 });
主项目(shoppingcard-api):
// 确保先初始化连接 import mongoose from 'mongoose'; import { AmountTypeSchema } from '../shoppingcard-models'; // 用主项目的Mongoose实例创建模型 export const AmountType = mongoose.model('AmountType', AmountTypeSchema);
这样模型就会绑定到主项目已建立的数据库连接上。
4. 检查数据库连接的初始化时机
确保在加载模型和启动路由之前,数据库连接已经成功建立。可以在连接成功后再启动服务器:
// app.ts import mongoose from 'mongoose'; import dotenv from 'dotenv'; dotenv.config(); mongoose.connect(process.env.MONGO_URI!) .then(() => { console.log('MongoDB连接成功'); // 在这里加载模型、路由,然后启动服务器 import('./routes').then(routes => { app.use('/api', routes.default); app.listen(8080, () => { console.log('服务器启动在8080端口'); }); }); }) .catch(err => { console.error('MongoDB连接失败:', err); process.exit(1); });
内容的提问来源于stack exchange,提问作者Papp Zoltán
相关产品推荐
相关产品推荐

