AdminJS对接NestJS TypeORM报NoResourceAdapterError错误排查
NestJS + TypeORM 集成AdminJS报NoResourceAdapterError解决
错误现象
集成AdminJS到使用TypeORM的NestJS项目时,应用启动失败,抛出错误:
UnhandledPromiseRejectionWarning: NoResourceAdapterError: There are no adapters supporting one of the resource you provided
未集成AdminJS时项目所有功能运行正常,已尝试过以下操作仍未解决问题:
- 在adminJsOptions中添加databases配置
- 将resources配置从
resources: [Usertest]替换为{ resource: Usertest }对象格式
问题相关的app.module.ts原始代码:
import { AdminModule } from '@adminjs/nestjs'; import { Database, Resource } from '@adminjs/typeorm'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { Usertest } from './usertestadminjs/entity/usertest.entity'; // import TypeORMAdapter from 'typeorm-adapter'; // AdminJS.registerAdapter(TypeORMAdapter); AdminJS.registerAdapter({ Database, Resource }); @Module({ imports: [ TypeOrmModule.forRoot({ type: 'postgres', host: 'hattie.db.elephantsql.com', port: 5432, username: 'ereree', password: 'rererer54f5453544', database: 'errerer', // entities: [Usertest], autoLoadEntities: true, synchronize: true, }), AdminModule.createAdmin({ adminJsOptions: { rootPath: '/admin', resources: [Usertest], // databases: [Database], // resources: [ // { // resource: Usertest, // }, // ], }, }), ], controllers: [AppController], providers: [AppService], }) export class AppModule {}
问题根因
报错触发的核心原因有两个:
- 缺失AdminJS核心类导入:代码中直接调用
AdminJS.registerAdapter但未从adminjs包导入核心类,适配器注册逻辑实际未执行 - 资源未被正确识别:要么AdminJS相关依赖版本不兼容,要么仅开启
autoLoadEntities时,直接导入的实体类未完成TypeORM连接注册,TypeORM适配器无法识别传入的资源
注意:注释中提到的typeorm-adapter是旧版第三方适配器,和官方维护的@adminjs/typeorm不能混用
修复步骤
- 对齐依赖版本,安装兼容的包版本:
# npm执行 npm install adminjs@^7.0.0 @adminjs/nestjs@^6.0.0 @adminjs/typeorm@^6.0.0 typeorm@^0.3.0 # pnpm执行 pnpm add adminjs@^7.0.0 @adminjs/nestjs@^6.0.0 @adminjs/typeorm@^6.0.0 typeorm@^0.3.0 # yarn执行 yarn add adminjs@^7.0.0 @adminjs/nestjs@^6.0.0 @adminjs/typeorm@^6.0.0 typeorm@^0.3.0
- 在app.module.ts顶部补全AdminJS核心类导入:
import AdminJS from 'adminjs';
- 在TypeOrmModule.forRoot配置中显式声明entities数组,加入
Usertest实体,不要仅依赖autoLoadEntities给AdminJS传资源 - 修正后的完整app.module.ts代码:
import { AdminModule } from '@adminjs/nestjs'; import { Database, Resource } from '@adminjs/typeorm'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Module } from '@nestjs/common'; import AdminJS from 'adminjs'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { Usertest } from './usertestadminjs/entity/usertest.entity'; AdminJS.registerAdapter({ Database, Resource }); @Module({ imports: [ TypeOrmModule.forRoot({ type: 'postgres', host: 'hattie.db.elephantsql.com', port: 5432, username: 'ereree', password: 'rererer54f5453544', database: 'errerer', entities: [Usertest], autoLoadEntities: true, synchronize: true, }), AdminModule.createAdmin({ adminJsOptions: { rootPath: '/admin', resources: [Usertest], }, }), ], controllers: [AppController], providers: [AppService], }) export class AppModule {}
完成以上步骤后重新启动项目即可正常加载AdminJS面板。
内容的提问来源于stack exchange,提问作者Illusion
相关产品推荐
相关产品推荐

