adminjs: NoResourceAdapterError: There are no adapters supporting one of the resource you provided

Describe the bug when I try to set up AdminBro for Nest.js + typeorm I am getting the next error: UnhandledPromiseRejectionWarning: NoResourceAdapterError: There are no adapters supporting one of the resource you provided.

Installed libraries and their versions “admin-bro”: “^3.3.1”, “admin-bro-expressjs”: “^2.1.1”, “admin-bro-typeorm”: “^0.1.6-alpha.9”, “express”: “^4.17.1”, “express-formidable”: “^1.2.0”, “@nestjs/common”: “7.0.0”, “@nestjs/core”: “7.0.0”, “@nestjs/platform-express”: “7.0.0”, “@nestjs/typeorm”: “7.0.0”,

To Reproduce Steps to reproduce the behavior: Create base nest.js application and put next: main.ts

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await setupAdminPanel(app);
  await app.listen(3000);
}
bootstrap();

token.entity.ts simple implementation

import AdminBro from "admin-bro";
import { Database, Resource } from '@admin-bro/typeorm';
import { validate } from 'class-validator'

AdminBro.registerAdapter({ Database, Resource });
Resource.validate = validate;

@Entity('token')
export class TokenEntity extends BaseEntity {
  @Column({ type: 'varchar' })
  accessToken: string;
}

Expected behavior Start server properly

Screenshots Screenshot 2020-11-06 at 10 43 04

AdminBroOptions with schema

import { INestApplication } from '@nestjs/common';
import AdminBro from 'admin-bro';
import * as AdminBroExpress from 'admin-bro-expressjs';
import { BaseEntity } from '../shared';

export async function setupAdminPanel(app: INestApplication): Promise<void> {
  const adminBro = new AdminBro({
    resources: [{ resource: TokenEntity, options: {} }],
    rootPath: '/admin',
  });

  const router = AdminBroExpress.buildRouter(adminBro);
  app.use(adminBro.options.rootPath, router);

}

Desktop:

  • OS: macOS Catalina v10.15.7

Additional context If I set up empty resources: [], the Server and Admin panel start properly. Also, I tried to set up it by official documentation but I have the same error. Could you please, help me realize what is wrong?

About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Comments: 27 (5 by maintainers)

Most upvoted comments

@Volodymyr-Zhuravlov @xinhash your Entity should extend BaseEntity.

import {
    BaseEntity,
    Entity
} from 'typeorm';

@Entity()
export class Person extends BaseEntity


Would be good to mention this in the docs… 😃

@MohammadKurjieh,I later found a solution for Nestjs and Prisma. I provided an answer in this StackOverflow question.

import AdminJS from 'adminjs';
import { AdminModule } from '@adminjs/nestjs';
import { Resource, Database } from '@adminjs/prisma';
import { getDMMF } from '@prisma/internals';

AdminJS.registerAdapter({ Resource, Database });

AdminModule.createAdminAsync({
      imports: [PrismaModule],
      inject: [PrismaService],
      useFactory: async (prisma: PrismaService) => {
        const prismaSchemaPath = path.join('./prisma', 'schema.prisma');
        const file = fs.readFileSync(prismaSchemaPath, 'utf-8');
        const dmmf = getDMMF({ datamodel: file });
        return {
          adminJsOptions: {
            rootPath: '/admin',
            resources: [
              {
                resource: {
                  model: (await dmmf).datamodel.models,
                  client: prisma,
                },
                options: {},
              },
            ],
          },
          auth: {
            authenticate,
            cookieName: 'adminjs',
            cookiePassword: 'secret',
          },
          sessionOptions: {
            resave: true,
            saveUninitialized: true,
            secret: 'secret',
          },
        };
      },
    }),

I am also getting similar issue. I am using prisma 4.

Facing same issue with ‘@admin-bro/sequelize

import { Database, Resource } from '@admin-bro/sequelize';
import { AdminModule } from '@admin-bro/nestjs';
AdminBro.registerAdapter({ Database, Resource });


SequelizeModule.forRoot({
      dialect: 'mysql',
      host: process.env.DATABASE_HOST,
      port: +process.env.DATABASE_PORT,
      username: process.env.DATABASE_USERNAME,
      password: process.env.DATABASE_PASSWORD,
      database: process.env.DATABASE_NAME,
      models: [__dirname + '/**/*.model.ts'],
      logging: console.log
    }),


    AdminModule.createAdmin({ adminBroOptions: { rootPath: '/admin', resources: [{ resource: User, options: {} }], } }),


@Table({
  modelName: 'user',
  timestamps: false
})
export class User extends Model {
}

I am facing a similar NoResourceAdapterError issue with nestjs and mongoose

import { Module } from '@nestjs/common';
import { MongooseModule, getModelToken } from '@nestjs/mongoose';
import { APP_INTERCEPTOR } from '@nestjs/core';
import { ConfigModule, ConfigService } from '@nestjs/config';
import { RavenModule, RavenInterceptor } from 'nest-raven';
import AdminBro from 'admin-bro';
import { AdminModule } from '@admin-bro/nestjs';
import { Model } from 'mongoose';
import { Database, Resource } from '@admin-bro/mongoose';
import { PolicyDocument } from './policies/interfaces/policy.interface';

AdminBro.registerAdapter({ Database, Resource });

@Module({
  imports: [
    AssessmentModule,
    AuthModule,
    ConfigModule.forRoot({
      envFilePath: '.env',
      validationSchema,
      validationOptions: {
        allowUnknown: true,
        abortEarly: false,
      },
    }),
    MongooseModule.forRootAsync({
      imports: [ConfigModule],
      useFactory: async (config: ConfigService) => ({
        uri: config.get('DB_CONNECTION_URL'),
        useNewUrlParser: true,
        useUnifiedTopology: true,
        useFindAndModify: false,
      }),
      inject: [ConfigService],
    }),
    AdminModule.createAdminAsync({
      useFactory: (policiesModel: Model<PolicyDocument>) => ({
        adminBroOptions: {
          rootPath: '/admin',
          resources: [
            { resource: policiesModel },
          ],
        },
      }),
    }),
    PoliciesModule,
  ],
  controllers: [AppController],
  providers: [
    {
      provide: APP_INTERCEPTOR,
      useValue: new RavenInterceptor(),
    },
    AppService,
    S3Service,
  ],
})