Как я могу настроить мультитенант в NESTJS - PullRequest
0 голосов
/ 11 мая 2019

Я хочу подключиться к любой базе данных, основанной на поддомене (мультитенант), но я не уверен, как мне это сделать, у меня есть следующий код для моей БД.

мой код запускается, когда приложениезапущен, но я не знаю, как я могу изменить источник данных, основанный на поддомене, пожалуйста, помогите мне, заранее спасибо.

PD: я создал промежуточное программное обеспечение в каждом запросе, но я не знаю, какизменить источник.

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

    },
  }
];

Я хочу менять источник данных emy в каждом запросе, основанном на поддомене (мультитенант)

1 Ответ

1 голос
/ 15 мая 2019

У нас также есть установка Mulit-Tenancy для нашей установки NestJS.
У вас может быть промежуточное программное обеспечение, которое в зависимости от запроса решает, какой источник данных использовать. В нашем примере мы используем TypeORM, который имеет довольно хорошую интеграцию с NestJS. В пакете TypeORM есть несколько полезных функций.

Middleware

export class AppModule {
  constructor(private readonly connection: Connection) {
  }

  configure(consumer: MiddlewareConsumer): void {
    consumer
      .apply(async (req, res, next) => {
        try {
          getConnection(tenant);
          next();
        } catch (e) {
          const tenantRepository = this.connection.getRepository(tenant);
          const tenant = await tenantRepository.findOne({ name: tenant });
          if (tenant) {
            const createdConnection: Connection = await createConnection(options);
            if (createdConnection) {
              next();
            } else {
              throw new CustomNotFoundException(
                'Database Connection Error',
                'There is a Error with the Database!',
              );
            }
          }
        }
      }).forRoutes('*');
   }

Это пример нашего промежуточного программного обеспечения. TypeORM внутренне управляет соединениями. Итак, первое, что вы попытаетесь - это загрузить соединение для этого конкретного арендатора. Если есть, хорошо, в противном случае просто создайте его. Хорошо, что созданное соединение остается доступным в диспетчере соединений TypeORM. Таким образом, у вас всегда есть связь в маршрутах.
В ваших маршрутах вам нужно удостоверение для ваших арендаторов. В нашем случае это просто строка, которая извлекается из URL. Независимо от того, какое это значение, вы можете связать его с объектом запроса в вашем промежуточном программном обеспечении. В вашем контроллере вы извлекаете это значение снова и передаете его своим службам. Затем вы должны загрузить хранилище для своего арендатора и вашего доброго пути.

Класс обслуживания

@Injectable()
export class SampleService {

  constructor() {}

  async getTenantRepository(tenant: string): Promise<Repository<Entity>> {
    try {
      const connection: Connection = await getConnection(tenant);
      return connection.getRepository(Property);
    } catch (e) {
      throw new CustomInternalServerError('Internal Server Error', 'Internal Server Error');
    }
  }

  async findOne(params: Dto, tenant: string) {

    const entityRepository: Repository<Entity> = await this.getTenantRepository(tenant);

    return await propertyRepository.findOne({ where: params });

  }

Так выглядит служба в нашем приложении.

Надеюсь, это вдохновит вас и поможет решить вашу проблему :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...