如何以正确的方式将@admin-bro/nestjs 与@admin-bro/typeorm 和postgres 一起使用?

Posted

技术标签:

【中文标题】如何以正确的方式将@admin-bro/nestjs 与@admin-bro/typeorm 和postgres 一起使用?【英文标题】:How to use @admin-bro/nestjs with @admin-bro/typeorm and postgres in a right way? 【发布时间】:2021-05-24 04:04:12 【问题描述】:

admin-bro-nestjs 存储库包含一个综合示例,其中包含 mongoose 示例。但我需要将它与 typeorm 和 postgres 一起使用。 我尝试将这个示例改编为 typeorm:

// main.ts
import AdminBro from 'admin-bro';
import  Database, Resource  from '@admin-bro/typeorm';
import  NestFactory  from '@nestjs/core';

import  AppModule  from './app.module';

AdminBro.registerAdapter( Database, Resource );

const bootstrap = async () => 
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);

bootstrap();

// app.module.ts
import  Module  from '@nestjs/common';
import  AdminModule  from '@admin-bro/nestjs';
import  TypeOrmModule, getRepositoryToken  from '@nestjs/typeorm';
import  Repository  from 'typeorm';

import  AppController  from './app.controller';
import  AppService  from './app.service';
import  UserEntity  from './user/user.entity';

@Module(
  imports: [
    TypeOrmModule.forRoot(
        type: 'postgres',
        host: 'localhost',
        port: 5432,
        username: 'postgres',
        password: 'password',
        database: 'database_test',
        entities: [UserEntity],
        synchronize: true,
        logging: false,
      ),
    AdminModule.createAdminAsync(
      imports: [
        TypeOrmModule.forFeature([UserEntity]),
      ],
      inject: [
        getRepositoryToken(UserEntity),
      ],
      useFactory: (userRepository: Repository<UserEntity>) => (
        adminBroOptions: 
          rootPath: '/admin',
          resources: [
             resource: userRepository ,
          ],
        ,
        auth: 
          authenticate: async (email, password) => Promise.resolve( email: 'test' ),
          cookieName: 'test',
          cookiePassword: 'testPass',
        ,
      ),
    ),
  ],
  controllers: [AppController],
  providers: [AppService],
)
export class AppModule  

但在应用程序启动时出现以下错误:

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

有没有人有将所有这些库放在一起的经验?

【问题讨论】:

【参考方案1】:

当我尝试将 AdminBro 与 NestJS/Express/TypeORM 集成时,我也得到了NoResourceAdapterError: There are no adapters supporting one of the resource you provided(尽管我使用的是 mysql 而不是 Postgres)。 admin-bro-nestjs Github issue which links to this question 中发布的解决方案对我没有帮助。

对我来说,NoResourceAdapterError 的原因仅仅是UserEntity 没有扩展BaseEntity。 NestJS/TypeORM 似乎可以在不扩展 BaseEntity 的情况下正常工作,但显然它是 AdminBro 所必需的。您可以在AdminBro TypeORM adapter documentation 的示例中看到它。

这是一个适合我的例子。

// user.entity
import  Entity, BaseEntity, Column, PrimaryGeneratedColumn  from 'typeorm';

@Entity()
export class UserEntity extends BaseEntity
  @PrimaryGeneratedColumn()
  id: number;
  @Column()
  name: string;

// app.module.ts
import  Module  from '@nestjs/common';
import  TypeOrmModule  from '@nestjs/typeorm';
import  AdminModule  from '@admin-bro/nestjs';
 
import  Database, Resource  from '@admin-bro/typeorm';
import AdminBro from 'admin-bro'
AdminBro.registerAdapter( Database, Resource );

@Module(
  imports: [
    TypeOrmModule.forRoot(
      // ...
    ),
    AdminModule.createAdmin(
        adminBroOptions: 
          resources: [UserEntity],
          rootPath: '/admin',
        ,
    )
  ],
  // ...
)

【讨论】:

以上是关于如何以正确的方式将@admin-bro/nestjs 与@admin-bro/typeorm 和postgres 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

如何以正确的方式将变量分配给 Ansible 中的另一个变量?

如何以编程方式将 LINQ 查询转换为正确描述 linq 表达式的可读英文文本?

如何以正确的方式读取组件内的 redux 状态?

如何以正确的方式旋转画布

如何以正确的方式使用英特尔 oneAPI?

如何以正确的方式处理 submit() 中的 ajax 响应?