SoftwareBrothers / adminjs

AdminJS is an admin panel for apps written in node.js
https://adminjs.co
MIT License
8.15k stars 659 forks source link

NoResourceAdapterError when using TypeORM #1554

Closed exp131 closed 1 year ago

exp131 commented 1 year ago
          I have the same error.
import AdminJS from 'adminjs';
import AdminJSExpress from '@adminjs/express';
import 'reflect-metadata';
import * as AdminJSTypeORM from '@adminjs/typeorm';
import express, { Express } from 'express';
import dotenv from 'dotenv';

// Database connection
import dataSource from './orm/datasource.js';
import { User } from './orm/models/user.js';

dotenv.config();

const port = process.env.PORT || 3000;

const start = async () => {
  const app: Express = express();
  await dataSource.initialize();

  // Initializtion
  AdminJS.registerAdapter({
    Resource: AdminJSTypeORM.Resource,
    Database: AdminJSTypeORM.Database
  });

  const adminOptions = {
    resources: [ User ]
  }
  const admin = new AdminJS(adminOptions);
  const adminRouter = AdminJSExpress.buildRouter(admin);
  app.use(admin.options.rootPath, adminRouter);

  app.listen(port, () => {
    console.log(`AdminJS started on http://localhost:${port}${admin.options.rootPath}`)
  });

}

start();

And the error:

[0] 5:55:44 PM - Found 0 errors. Watching for file changes.
[1] (node:31804) ExperimentalWarning: Import assertions are not a stable feature of the JavaScript language. Avoid relying on their current behavior and syntax as those might change in a future version of Node.js.
[1] (Use `node --trace-warnings ...` to show where the warning was created)
[1] (node:31804) ExperimentalWarning: Importing JSON modules is an experimental feature and might change at any time
[1] file:///Users/vitalyradchik/Devel/StilyoApps/Tests/adminjs-app-ts/node_modules/adminjs/lib/backend/utils/resources-factory/resources-factory.js:73
[1]         throw new NoResourceAdapterError(resourceObject);
[1]               ^
[1] 
[1] NoResourceAdapterError: There are no adapters supporting one of the resource you provided
[1]     at file:///Users/vitalyradchik/Devel/StilyoApps/Tests/adminjs-app-ts/node_modules/adminjs/lib/backend/utils/resources-factory/resources-factory.js:73:15
[1]     at Array.map (<anonymous>)
[1]     at ResourcesFactory._convertResources (file:///Users/vitalyradchik/Devel/StilyoApps/Tests/adminjs-app-ts/node_modules/adminjs/lib/backend/utils/resources-factory/resources-factory.js:68:22)
[1]     at ResourcesFactory.buildResources (file:///Users/vitalyradchik/Devel/StilyoApps/Tests/adminjs-app-ts/node_modules/adminjs/lib/backend/utils/resources-factory/resources-factory.js:28:35)
[1]     at new AdminJS (file:///Users/vitalyradchik/Devel/StilyoApps/Tests/adminjs-app-ts/node_modules/adminjs/lib/adminjs.js:80:39)
[1]     at start (file:///Users/vitalyradchik/Devel/StilyoApps/Tests/adminjs-app-ts/dist/main.js:23:19) {
[1]   resource: [class User extends BaseEntity]
[1] }
[1] 
[1] Node.js v20.0.0

Originally posted by @exp131 in https://github.com/SoftwareBrothers/adminjs/issues/976#issuecomment-1705411603

dziraf commented 1 year ago
import dataSource from './orm/datasource.js';
import { User } from './orm/models/user.js';

dotenv.config();

Can you check if you have access to environment variables in your datasource/User files? dotenv should rather be at the top of the file. I prefer to use a CLI version myself:

    "start": "dotenv -c '.env' -- node dist/server/index.js",
exp131 commented 1 year ago

Yes, it is available. I even disabled dotenv completely in the project, but the error remains the same.

exp131 commented 1 year ago

To update: Here data source and entity configs used:

orm/datasource.ts

import { DataSource } from 'typeorm';

const SqliteDataSource = new DataSource({
  type: 'sqlite',
  database: './db.sqlite'
});

export default SqliteDataSource;

orm/models/user.ts

import { BaseEntity, Column, Entity, PrimaryGeneratedColumn } from 'typeorm';

@Entity({ name: 'User' })
export class User extends BaseEntity {
  @PrimaryGeneratedColumn()
  public id: number;

  @Column()
  public firstName: string;

  @Column()
  public lastName: string;
}
dziraf commented 1 year ago

Is there a specific reason why you don't add your User entity to your datasource? In comparison, this is my config for Postgres:

import { DataSourceOptions } from 'typeorm';

import '../config/index.js'; // dotenv
import Admin from '../modules/admins/entities/admin.entity.js';
import Customer from '../modules/customers/entities/customer.entity.js';
import Category from '../modules/categories/entities/category.entity.js';
import Product from '../modules/products/entities/product.entity.js';
import Order from '../modules/orders/entities/order.entity.js';
import OrderItem from '../modules/orders/entities/order-item.entity.js';
import Dataset from '../modules/datasets/entities/dataset.entity.js';

import { CreateDatabaseStructure1693219188675 } from './migrations/1693219188675-CreateDatabaseStructure.js';

const config: DataSourceOptions = {
  type: 'postgres' as const,
  url: process.env.DATABASE_URL ?? process.env.POSTGRES_DATABASE_URL,
  synchronize: process.env.DATABASE_SYNC === 'true',
  logging: process.env.DATABASE_LOGGING === 'true',
  entities: [Admin, Customer, Category, Product, Order, OrderItem, Dataset],
  migrations: [CreateDatabaseStructure1693219188675],
  migrationsRun: false,
  migrationsTableName: 'migrations',
  migrationsTransactionMode: 'all',
  subscribers: [],
  extra: process.env.REQUIRE_SSL === 'true'
    ? { ssl: { require: true, rejectUnauthorized: false } }
    : undefined,
};
exp131 commented 1 year ago

I just followed the docs, but this is a solution. Now it working fine, thanks a lot @dziraf

exp131 commented 1 year ago

Issue fixeed