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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 01:24:29