未找到连接“默认”-TypeORM、NestJS 和外部 NPM 包

Posted

技术标签:

【中文标题】未找到连接“默认”-TypeORM、NestJS 和外部 NPM 包【英文标题】:Connection "default" was not found - TypeORM, NestJS and external NPM Package 【发布时间】:2019-09-08 20:14:04 【问题描述】:

我正在使用 NestJs 创建几个应用程序,我想将代码从 NestInterceptor 移动到外部 NPM 包,以便我可以在多个应用程序中使用相同的拦截器。

问题在于,在“本地”使用时可以工作的相同代码在移动到外部包时会停止工作。

这是拦截器的代码:

import  Injectable, NestInterceptor, CallHandler, ExecutionContext  from '@nestjs/common'
import  map  from 'rxjs/operators'
import  getManager  from 'typeorm'
import jwt_decode from 'jwt-decode'

@Injectable()
export class MyInterceptor implements NestInterceptor 
  entity: any

  constructor(entity: any) 
    this.entity = entity
  

  async intercept(context: ExecutionContext, next: CallHandler): Promise<any> 

    const request = context.switchToHttp().getRequest()

    const repository = getManager().getRepository(this.entity)

    return next.handle().pipe(map((data) => data))
  

这是一个给定的控制器:

import  myInterceptor  from "../src/interceptors/interceptor.ts";

@UseInterceptors(new CompanyIdInterceptor(User))
export class UserController 

这工作正常,但如果将文件移动到外部 NPM 包并像这样从中导入:

import  myInterceptor  from "mynpmpackage";

我收到以下错误:

[Nest] 24065   - 04/18/2019, 10:04 AM   [ExceptionsHandler] Connection "default" was not found. +26114ms
ConnectionNotFoundError: Connection "default" was not found.
    at new ConnectionNotFoundError (/home/andre/Services/npm-sdk/src/error/ConnectionNotFoundError.ts:8:9)
    at ConnectionManager.get (/home/andre/Services/npm-sdk/src/connection/ConnectionManager.ts:40:19)

任何想法,是什么原因以及如何解决它?

【问题讨论】:

你使用 ts-node 吗?请注意,在节点模块中,您需要为 *.js 文件(实体和所有)定义 TypeOrm 连接,在 ts-node 中它适用于 *.ts 文件。 我确实使用 ts-node,但在我的 Typeorm 设置中,我确实计算了 js 文件:实体:[$path.join(appRootPath.path, 'src,dist')/**/*.entity.ts,.js, ], @AndréD.Oliveira 当你将拦截器移动到外部包时,你有 typeorm 作为依赖还是对等依赖? @shusson 我有 typeOrm 作为依赖和对等依赖。 @AndréD.Oliveira 尝试使 typeorm 仅成为外部包中的对等依赖项 【参考方案1】:

这可能不是您的问题,但是在使用 TypeORM 将内容移动到外部包时,我遇到了类似的问题。确保父项目中的所有包都使用相同版本的 TypeORM 包。

就我而言,使用yarn why typeorm 向我展示了正在安装的两个不同版本。其中一个用于注册实体,而框架使用另一个版本连接到 SQL 数据库,从而产生这种冲突。

使用 yarn why [pkg-name] 检查您的版本,或者如果您使用 NPM,请尝试使用 npx npm-why [pkg-name] 或从 https://www.npmjs.com/package/npm-why 全局安装。

【讨论】:

嗨 Luis,感谢您的回答,我确实检查了它,应用程序和包都使用最新版本的 TypeOrm。 抱歉没有帮到你。此外,您可以使用Connection Manager API 调试您的连接。尝试将TypeORM中注册的连接发送到console,也许它会告诉你一些有助于调试的东西。【参考方案2】:

在验证两个包中的 TypeOrm 版本相同后,即@Luís Brito 提到的外部包和消费者存储库仍然存在问题,然后问题可能是-

基本上当我们创建外部包时——TypeORM 会尝试获取 "default" 连接选项,但如果未找到则抛​​出错误:

ConnectionNotFoundError:找不到连接“默认”。

我们可以通过在建立连接之前进行某种健全性检查来解决这个问题 - 幸运的是,我们在 getConnectionManager() 上有 .has() 方法。

import  Connection, getConnectionManager, getConnectionOptions, 
  createConnection, getConnection, QueryRunner  from 'typeorm';
    
    async init() 
    let connection: Connection;
    let queryRunner: QueryRunner;

     if (!getConnectionManager().has('default')) 
        const connectionOptions = await getConnectionOptions();
        connection = await createConnection(connectionOptions);
       else 
        connection = getConnection();
      

    queryRunner = connection.createQueryRunner(); 
 

上面是一个快速代码-sn-p,它是此问题的实际 根本原因,但如果您有兴趣查看完整的工作存储库(不同示例)-

外部 NPM 包: Git Repo:git-unit-of-work(具体文件-src/providers/typeorm/typeorm-uow.ts) 在 NPM 中发布:npm-unit-of-work 上述包的消费者:nest-typeorm-postgre(具体文件-package.json, src/countries/countries.service.ts & countries.module.ts

【讨论】:

是的@PraveenMP 这个解决方案有效,请查看为这个解决方案创建的示例 repo

以上是关于未找到连接“默认”-TypeORM、NestJS 和外部 NPM 包的主要内容,如果未能解决你的问题,请参考以下文章

使用 NestJS 服务单元测试未找到连接“默认”

服务的 NestJS 单元测试:模拟 getManager 导致“未找到连接“默认””错误

NestJS/TypeORM:无法读取未定义的属性“createQueryBuilder”

NestJS:通过请求(子域)连接数据库(TypeORM)

NestJS TypeORM InjectRepository 无法读取未定义的属性“原型”

在 Nestjs 中注入 Tree Typeorm 存储库