相关疑难解决方法(0)

NestJS + TypeORM:使用两个或多个数据库?

自2天以来,我一直在尝试解决此问题,也许我只是在这里遗漏了要点。

我的目标是编写一个NestJS应用程序(包括TypeORM),该应用程序为我的2个或3个小项目提供RestAPI,而不是为其中每个项目都编写一个NestJS-App。

到目前为止,该应用程序已经准备就绪,可以与单个项目(包含其实体,控制器,服务,模块的子文件夹)一起很好地工作,但是我无法使其与所有项目一起运行。

关键似乎是配置,我正在使用ormconfig.json

[ {
    "name": "Project1",
    "type": "mysql",
    "host": "localhost",
    "port": 3306,
    "username": "<username>",
    "password": "<pwd>",
    "database": "<database>",
    "synchronize": false,
    "entities": ["project1/*.entity.ts"],
    "subscribers": ["project1/*.subscriber.ts"],
    "migrations": ["project1/migrations/*.ts"],
    "cli": { "migrationsDir": "project1/migrations" }
}, {
    "name": "project2",
    "type": "mysql",
    "host": "localhost",
    "port": 3306,
    "username": "<another-username>",
    "password": "<another-pwd>",
    "database": "<another-database>",
    "synchronize": false,
    "entities": ["project2/*.entity.ts"],
    "subscribers": ["project2/*.subscriber.ts"],
    "migrations": ["project2/migrations/*.ts"],
    "cli": { "migrationsDir": "project2/migrations"
    } ]
Run Code Online (Sandbox Code Playgroud)

错误消息显示:

[ExceptionHandler]找不到连接默认值,因为它未在任何orm配置文件中定义

当然找不到“默认”,因为我提供了两个配置,它们的唯一名称不同于“默认”。

ApplicationModule中,我可以提供连接的名称,如下所示:

TypeOrmModule.forRoot( { name: "project1" } ),
Run Code Online (Sandbox Code Playgroud)

但是它仅适用于一个项目。

我可以将所有内容混合在一个配置中,但随后我会将所有内容都存储在一个数据库中,所有用户都由同一用户使用,并且可能混合实体...

有人可以给我提示如何解决这个问题吗?也许 …

javascript node.js typeorm nestjs

7
推荐指数
4
解决办法
3245
查看次数

TypeORM:在运行时动态设置EntityManager或存储库的数据库架构?

情况:

对于我们的SaaS API,我们使用基于架构的多租户,这意味着每个客户(〜租户)在同一个(postgres)数据库中都有自己独立的架构,而不会干扰其他客户。每个模式都包含相同的基础实体模型。

每次向系统注册新客户时,都会在数据库中自动创建一个新的隔离模式。这意味着该架构是在运行时创建的,并且事先未知。客户的架构是根据客户的域命名的。

对于到达我们API的每个请求,我们从JWT中提取用户的租约关联,并确定使用哪个db模式来为此租户执行请求的db操作。

问题

通过TypeORM(例如,使用createConnection)建立与(postgres)数据库的连接之后,我们为db-operation设置架构的唯一机会是诉诸于createQueryBuilder

const orders = await this.entityManager
  .createQueryBuilder()
  .select()
  .from(`${tenantId}.orders`, 'order') // <--- setting schema-prefix here
  .where("order.priority = 4")
  .getMany();
Run Code Online (Sandbox Code Playgroud)

这意味着,我们不得不使用,QueryBuilder因为在使用EntityManager API(或Repository API)时似乎无法设置架构。

但是,我们希望/需要使用这些API,因为它们更容易编写,需要更少的代码并且也不容易出错,因为它们不依赖于使用基于字符串的语法“手动”编写查询。

如果是TypeORM,在使用EntityManager或存储库时是否可以通过某种方式设置db模式?

像这样吗

// set schema when instantiating manager
const manager = connection.createEntityManager({ schema: tenantDomain });

// should find all matching "order" entities within schema
const orders = manager.find(Order, { priority: …
Run Code Online (Sandbox Code Playgroud)

postgresql orm multi-tenant typeorm nestjs

6
推荐指数
1
解决办法
546
查看次数

使用多租户构建 Nest.js 应用程序(使用 postgres 模式的每个租户和续集 ORM)并动态切换模式?

我们的团队决定使用 Nest.js 来实现基于 SaaS 的应用程序,并且是 Node.js 环境的新手。对于数据库存储,我们使用 postgres,它支持每个租户的多个模式,sequelise 是我们的 ORM。现在我们面临的一个问题是如何动态切换schema。经过大量研究后,我们找不到可靠的方法。以下是我们遇到的一些事情,

现在我的问题是,由于 node.js 是单线程环境,我想知道下面提到的哪种方式是续集的最佳用例。

  • 创建一个中间件并将架构名称动态设置为请求标头。

选项1:

从sequelise的文档中,有一个选项可以使用“options.searchPath”为每个orm方法(find、findAll ...)设置搜索路径。由于 Node.js 是单线程的,因此在请求标头中传递架构名称并在这样的查询中使用它,是否会导致需要注意的任何问题。在 Ruby On Rails 中,我们有单独的线程使用“thread.current”来处理这个问题,有人可以解释这种方法吗?

选项2:

由于我们已经有了基于代码的代码,是否有一种像 typeOrm 版本那样动态获取续集数据库连接的方法,如上所述,这样我们就不会更改现有代码中的其他任何地方,如果是这样,该怎么做?

谢谢

postgresql database-schema sequelize.js nestjs

5
推荐指数
0
解决办法
2315
查看次数

我如何在 NESTJS 中设置多租户

我想连接到基于子域(多租户)的任何数据库,但我不知道该怎么做。

我的代码在应用程序启动时运行,但我不知道如何根据子域更改数据源。

PS:我在每个请求上都创建了中间件,但我不知道如何更改源。

我的数据库有以下代码:

import { connect, createConnection } from 'mongoose';
import { SERVER_CONFIG, DB_CONNECTION_TOKEN } from '../server.constants';

 const opts = {
    useCreateIndex: true,
    useNewUrlParser: true,
    keepAlive: true,
    socketTimeoutMS: 30000,
    poolSize: 100,
    reconnectTries: Number.MAX_VALUE,
    reconnectInterval: 500,
    autoReconnect: true,
  };
export const databaseProviders = [
  {
    provide: DB_CONNECTION_TOKEN,
    useFactory: async () => {
      try {
        console.log(`Connecting to ${ SERVER_CONFIG.db }`);
        return await createConnection(`${SERVER_CONFIG.db}`, opts);
      } catch (ex) {
        console.log(ex);
      }

    },
  }
];
Run Code Online (Sandbox Code Playgroud)

我想根据子域(多租户)在每个请求中更改我的数据源

multi-tenant mongodb nestjs

4
推荐指数
2
解决办法
6673
查看次数