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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:06:04