adminjs icon indicating copy to clipboard operation
adminjs copied to clipboard

[Bug]: NoResourceAdapterError: There are no adapters supporting one of the resource you provided

Open behruzrahimov opened this issue 1 year ago • 1 comments

Contact Details

No response

What happened?

When starting the application with AdminJS integrated, an error occurs: NoResourceAdapterError: There are no adapters supporting one of the resource you provided. This error is thrown when attempting to use TypeORM entities with AdminJS.

I expected AdminJS to recognize and use the TypeORM entities without throwing an error, allowing me to manage the entities through the AdminJS interface.

Bug prevalence

This bug occurs every time the application is started.

AdminJS dependencies version

Here is a list of the relevant dependencies from package.json:


    "adminjs": "7.8.7",
    "@adminjs/nestjs": "6.1.0",
    "@adminjs/express": "6.1.0",
    
 "dependencies": {
    "@nestjs/common": "^10.3.8",
    "@nestjs/config": "^3.2.2",
    "@nestjs/core": "^10.3.8",
    "@nestjs/platform-express": "^10.3.8",
    "@nestjs/swagger": "^7.4.0",
    "dotenv": "^16.4.5",
    "jsonwebtoken": "^9.0.2",
    "pg": "^8.11.5",
    "typeorm": "^0.3.20",
    "uuid": "^9.0.1",
    "class-validator": "^0.14.1",
    "class-transformer": "^0.5.1",
    "adminjs": "7.8.7",
    "@adminjs/nestjs": "6.1.0",
    "@adminjs/express": "6.1.0",
    "express-session": "1.18.0",
    "express-formidable": "1.2.0",
    "@adminjs/sql": "2.2.6",
    "@babel/plugin-syntax-import-assertions": "7.24.7",
    "@adminjs/typeorm": "5.0.1",
    "body-parser": "1.20.2"
  },
  "devDependencies": {
    "@nestjs/cli": "^10.3.2",
    "@nestjs/schematics": "^10.1.1",
    "@nestjs/testing": "^10.3.8",
    "@types/express": "^4.17.21",
    "@types/jest": "^29.5.12",
    "@types/jsonwebtoken": "^9.0.6",
    "@types/multer": "^1.4.11",
    "@types/node": "^20.12.12",
    "@types/supertest": "^6.0.2",
    "@types/uuid": "^9.0.8",
    "@typescript-eslint/eslint-plugin": "^6.21.0",
    "@typescript-eslint/parser": "^6.21.0",
    "jest": "^29.7.0",
    "prettier": "^3.3.2",
    "source-map-support": "^0.5.21",
    "supertest": "^6.3.4",
    "ts-jest": "^29.1.2",
    "ts-loader": "^9.5.1",
    "ts-node": "^10.9.2",
    "tsconfig-paths": "^4.2.0",
    "typescript": "^5.4.5",
    "@types/body-parser": "1.19.5"
  }

What browsers do you see the problem on?

Chrome

Relevant log output

file:///project/node_modules/.pnpm/[email protected]_@[email protected]_@[email protected]/node_modules/adminjs/lib/backend/utils/resources-factory/resources-factory.js:73
        throw new NoResourceAdapterError(resourceObject);
              ^

NoResourceAdapterError: There are no adapters supporting one of the resource you provided
    at file:///project/node_modules/.pnpm/[email protected]_@[email protected]_@[email protected]/node_modules/adminjs/lib/backend/utils/resources-factory/resources-factory.js:73:15
    at Array.map (<anonymous>)
    at ResourcesFactory._convertResources (file:///project/node_modules/.pnpm/[email protected]_@[email protected]_@[email protected]/node_modules/adminjs/lib/backend/utils/resources-factory/resources-factory.js:68:22)
    at ResourcesFactory.buildResources (file:///project/node_modules/.pnpm/[email protected]_@[email protected]_@[email protected]/node_modules/adminjs/lib/backend/utils/resources-factory/resources-factory.js:28:35)
    at new AdminJS (file:///project/node_modules/.pnpm/[email protected]_@[email protected]_@[email protected]/node_modules/adminjs/lib/adminjs.js:79:39)
    at AdminModule.onModuleInit (file:///project/node_modules/.pnpm/@[email protected]_@[email protected][email protected][email protected]_r_qveeu3yzi3vkc6zsjdlix6dbiu/node_modules/@adminjs/nestjs/build/admin.module.js:70:23)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
    at async callModuleInitHook (/project/node_modules/.pnpm/@[email protected]_@[email protected][email protected][email protected]_re_mxy2umldb5kjaz5pxuunqqkrty/node_modules/@nestjs/core/hooks/on-module-init.hook.js:51:9)
    at async NestApplication.callInitHook (project/node_modules/.pnpm/@[email protected]_@[email protected][email protected][email protected]_re_mxy2umldb5kjaz5pxuunqqkrty/node_modules/@nestjs/core/nest-application-context.js:223:13)
    at async NestApplication.init (project/node_modules/.pnpm/@[email protected]_@[email protected][email protected][email protected]_re_mxy2umldb5kjaz5pxuunqqkrty/node_modules/@nestjs/core/nest-application.js:100:9) {
  resource: [Module: null prototype] {
    UserEntity: EntitySchema {
      options: {
        name: 'UserEntity',
        tableName: 'users',
        columns: {
          id: {
            type: 'uuid',
            primary: true,
            generated: 'uuid',
            unique: true
          },
          name: { type: 'varchar' },
          surname: { type: 'varchar' },
          patronymic: { type: 'varchar', nullable: true },
          gender: { type: 'enum', enum: [Array] },
          age: { type: 'int', nullable: true },
          district: { type: 'varchar', nullable: true },
          role: { type: 'enum', enum: [Array] },
          school: { type: 'varchar', nullable: true },
          email: { type: 'varchar' },
          password: { type: 'varchar' },
          createdAt: { type: 'timestamp', createDate: true },
          deletedAt: { type: 'timestamp', deleteDate: true, nullable: true }
        }
      },
      '@instanceof': Symbol(EntitySchema)
    }
  }
}


### Relevant code that's giving you issues

```TypeScript
1.AdminJS options configuration:


import { AdminJSOptions } from 'adminjs';
import { UserEntity } from '../_db/entity/UserEntity';
import componentLoader from './component-loader.js';

const options: AdminJSOptions = {
  componentLoader,
  rootPath: '/admin',
  resources: [
    {
      resource: UserEntity,
      options: {
        // Customize AdminJS options for the resource here
      },
    },
  ],
};

export default options;

Main NestJS application bootstrap:

import { NestFactory } from '@nestjs/core';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import { ModuleApp } from './app/module.app.js';
import { AppDataSource } from './app/globals.app.js';
import * as AdminJSTypeorm from '@adminjs/typeorm';
import AdminJS from 'adminjs';

async function bootstrap() {
  const app = await NestFactory.create(ModuleApp, { cors: true });

  // Register the TypeORM adapter
  AdminJS.registerAdapter(AdminJSTypeorm);

  await AppDataSource.initialize();
  const config = new DocumentBuilder()
    .setTitle('Career API')
    .setDescription('The Career API documentation')
    .setVersion('1.0')
    .addBearerAuth()
    .build();
  const document = SwaggerModule.createDocument(app, config);
  SwaggerModule.setup('swagger', app, document);
  await app.listen(8000);
}

bootstrap().then(() => console.log('Server started on http://localhost:8000/'));

app module

import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
import * as controllers from '../controller/_index.js';
import { AuthMiddleware } from '../middleware/_index.js';
import * as providers from '../service/_index.js';
import { AdminModule } from '@adminjs/nestjs';
import { ConfigModule } from '@nestjs/config';
import options from '../admin/options.js';
import provider from '../admin/auth-provider.js';
import * as dotenv from 'dotenv';
dotenv.config();
@Module({
  imports: [
    ConfigModule.forRoot({
      envFilePath: '.env',
    }),

    AdminModule.createAdminAsync({
      useFactory: () => ({
        adminJsOptions: options,
        auth: {
          provider,
          cookiePassword: process.env.COOKIE_SECRET!,
          cookieName: 'adminjs',
        },
        sessionOptions: {
          resave: true,
          saveUninitialized: true,
          secret: process.env.COOKIE_SECRET!,
        },
      }),
    }),
  ],
  controllers: Object.values(controllers),
  providers: Object.values(providers),
})
export class ModuleApp implements NestModule {
  configure(consumer: MiddlewareConsumer) {
    consumer.apply(AuthMiddleware).forRoutes('/12345');
  }
}


behruzrahimov avatar Jul 25 '24 08:07 behruzrahimov

EntitySchema is not supported, @adminjs/typeorm only works with classes that extend BaseEntity

dziraf avatar Jul 25 '24 08:07 dziraf