在NestJS集成AdminJS与Prisma时遇NoResourceAdapterError错误求助
解决AdminJS + NestJS + Prisma配置中的NoResourceAdapterError错误
问题场景
在NestJS(9.0.0)中配置AdminJS(6.8.6)与Prisma(4.9.0)时,向adminJsOptions.resources数组添加指定资源后触发NoResourceAdapterError错误。
错误日志
\node_modules\adminjs\lib\backend\utils\resources-factory\resources-factory.js:93 return resources.map(rawResource => { ^ NoResourceAdapterError: There are no adapters supporting one of the resource you provided at D:\task-manager\node_modules\adminjs\lib\backend\utils\resources-factory\resources-factory.js:99:15 at Array.map (<anonymous>) at ResourcesFactory._convertResources (D:\task-manager\node_modules\adminjs\lib\backend\utils\resources-factory\resources-factory.js:93:22) at ResourcesFactory.buildResources (D:\task-manager\node_modules\adminjs\lib\backend\utils\resources-factory\resources-factory.js:48:35) at new AdminJS (D:\task-manager\node_modules\adminjs\lib\adminjs.js:114:39) at AdminModule.onModuleInit (D:\task-manager\node_modules\@adminjs\nestjs\src\admin.module.ts:136:19) at callModuleInitHook (D:\task-manager\node_modules\@nestjs\core\hooks\on-module-init.hook.js:51:35) at NestApplication.callInitHook (D:\task-manager\node_modules\@nestjs\core\nest-application-context.js:210:13) at NestApplication.init (D:\task-manager\node_modules\@nestjs\core\nest-application.js:97:9) at NestApplication.listen (D:\task-manager\node_modules\@nestjs\core\nest-application.js:155:33)
问题代码
核心资源配置代码
const prisma = new PrismaService(); const dmmf = ((prisma as any)._baseDmmf as DMMFClass); // ...其他代码 { resource: { model: dmmf.modelMap.Publisher, client: prisma }, options: {}, }
完整AppModule代码
import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { AdminModule } from '@adminjs/nestjs'; import * as AdminJSPrisma from '@adminjs/prisma' import AdminJS from 'adminjs' import { PrismaService } from './prisma/prisma.service'; import { DMMFClass } from '@prisma/client/runtime' AdminJS.registerAdapter({ Resource: AdminJSPrisma.Resource, Database: AdminJSPrisma.Database, }) @Module({ imports: [ AdminModule.createAdminAsync({ useFactory: () => { const prisma = new PrismaService(); const dmmf = ((prisma as any)._baseDmmf as DMMFClass); return { adminJsOptions: { rootPath: '/admin', resources: [ { resource: { model: dmmf.modelMap.Publisher, client: prisma }, options: {}, } ], } } }, }), ], controllers: [AppController], providers: [AppService], }) export class AppModule { }
排查与解决方案
1. 适配依赖版本
AdminJS Prisma适配器版本需与AdminJS、Prisma版本匹配。当前@adminjs/prisma可能和Prisma 4.9.0不兼容,升级适配器到适配Prisma 4.x的版本:
npm install @adminjs/prisma@latest
2. 修正DMMF获取方式
直接访问私有属性_baseDmmf存在兼容性问题,改用Prisma公开的$schema.dmmf属性获取:
// 替换原dmmf获取代码 const dmmf = prisma.$schema.dmmf;
3. 正确注入Prisma实例
避免在useFactory中直接实例化PrismaService,通过依赖注入获取已初始化的实例:
修改AdminModule.createAdminAsync配置:
AdminModule.createAdminAsync({ inject: [PrismaService], useFactory: (prisma: PrismaService) => { const dmmf = prisma.$schema.dmmf; return { adminJsOptions: { rootPath: '/admin', resources: [ { resource: { model: dmmf.modelMap.Publisher, client: prisma }, options: {}, } ], } } }, }),
同时确保PrismaService在模块的providers数组中。
4. 完整修正后的AppModule示例
import { Module } from '@nestjs/common'; import { AppController } from './app.controller'; import { AppService } from './app.service'; import { AdminModule } from '@adminjs/nestjs'; import * as AdminJSPrisma from '@adminjs/prisma' import AdminJS from 'adminjs' import { PrismaService } from './prisma/prisma.service'; // 提前注册适配器,确保在AdminModule初始化前完成 AdminJS.registerAdapter({ Resource: AdminJSPrisma.Resource, Database: AdminJSPrisma.Database, }) @Module({ imports: [ AdminModule.createAdminAsync({ inject: [PrismaService], useFactory: (prisma: PrismaService) => { const dmmf = prisma.$schema.dmmf; return { adminJsOptions: { rootPath: '/admin', resources: [ { resource: { model: dmmf.modelMap.Publisher, client: prisma }, options: {}, } ], } } }, }), ], controllers: [AppController], providers: [AppService, PrismaService], }) export class AppModule { }
内容的提问来源于stack exchange,提问作者James Nganga
相关产品推荐
相关产品推荐

