AdonisJS自定义Provider中建立Mongoose连接超时问题求助
问题根本原因
你将Mongoose的异步连接逻辑写在了Provider的register方法中,而AdonisJS V5的Provider生命周期中,register阶段仅用于同步注册容器绑定,不会等待异步逻辑执行完成。这就导致服务启动时Mongoose的连接还在后台初始化,请求进来时数据库连接尚未就绪,操作会被Mongoose挂起直到连接超时,所以你的请求一直没有响应。
另外你自定义了独立的Mongoose实例绑定到IOC容器,要确保模型中使用的所有mongoose方法(Schema、model)都来自你绑定的实例,不要和全局mongoose实例混用。
修复步骤
1. 调整Provider的生命周期逻辑
将连接操作移到支持异步等待的boot方法中,register阶段仅同步注册单例:
import { ApplicationContract } from '@ioc:Adonis/Core/Application' import { Mongoose } from 'mongoose' export default class MongoProvider { constructor(protected app: ApplicationContract) {} public register() { // 仅同步注册Mongoose单例到容器 this.app.container.singleton('Mongoose', () => new Mongoose()) } public async boot() { // boot阶段Adonis会等待异步逻辑执行完成再启动服务 const mongoose = this.app.container.use('Mongoose') await mongoose.connect('mongodb://docker_mongo:27017/mydb') } public async shutdown() { await this.app.container.use('Mongoose').disconnect() } }
2. 校验类型定义文件
检查contracts/Mongoose.ts是否正确导出了你绑定的Mongoose实例类型,确保模型导入的是容器内的实例:
declare module '@ioc:Mongoose' { import mongoose from 'mongoose' export = mongoose }
3. 调整Provider注册顺序
在.adonisrc.json的providers数组中,将你的MongoProvider放到AppProvider之前,保证容器绑定在应用模型加载前就已完成注册。
4. 避免混用全局mongoose实例
不要在项目其他地方直接导入mongoose包使用,所有操作都从@ioc:Mongoose导入,保证使用的是同一个已连接的实例。
内容的提问来源于stack exchange,提问作者o..o
相关产品推荐
相关产品推荐

