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

时间:2019-04-18 13:19:06

标签: nestjs typeorm

我正在使用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)

任何想法,关于什么原因以及如何解决?

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

基本上当我们创建一个外部包时 - TypeORM 尝试获取 "default" 连接选项,但如果没有找到则抛出错误:

<块引用>

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

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

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(); 
 }

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

  • 外部 NPM 包:
  • 上述包的使用者:nest-typeorm-postgre(特定文件 - package.json、src/countries/countries.service.ts 和 countries.module.ts