Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

NestJS e Banco Oracle

Boa tarde!

Existe alguma maneira de realizar a conexão do NestJS com banco de dados da Oracle? De preferencia sem o uso de um ORM....

Já dei uma olhada por ai e não achei nenhuma solução que funcione.

Estou usando esse pacote do Oracle: oracleDB

Eu sei como utilizar ele sem o NestJS.

Se alguém tiver alguma doc ou orientação. Agradeço.

1 resposta
solução!

Bom dia!

Consegui realizar a conexão.

Para quem precisar vou deixar um modelo do código: Criei um provider com o Pool de conexões:

import { ConfigService } from '@nestjs/config';
import { createPool, initOracleClient } from 'oracledb';
import { IConfiguracaoDatabase } from 'src/config/configuracao';
import { ORACLE } from '../constants/database';
// eslint-disable-next-line @typescript-eslint/no-var-requires
const oracledb = require('oracledb');

export const OracleProviderFactory = {
  provide: ORACLE,
  inject: [ConfigService], //necessário para injetar o service
  useFactory: async (configService: ConfigService) => {
    try {
      const configDatabase =
        configService.get<IConfiguracaoDatabase>('database');

      if (!process.env.LD_LIBRARY_PATH) {
        initOracleClient({ libDir: './lib/instantclient_21_3' });
      }

      initOracleClient({ libDir: process.env.LD_LIBRARY_PATH });
      oracledb.outFormat = oracledb.OUT_FORMAT_OBJECT;

      await createPool({
        user: configDatabase.user,
        password: configDatabase.password,
        connectionString: configDatabase.connectionString,
        poolAlias: ORACLE,
        poolMax: 5,
        poolMin: 1,
      });

      console.log('Conexão UP!');
    } catch (error) {
      console.error(error);
    }
  },
};

Um service para pegar uma conexão do poll

import { Injectable } from '@nestjs/common';
import { Connection, getConnection } from 'oracledb';

@Injectable()
export class OracleService {
  async conexao(alias: string): Promise<Connection> {
    try {
      return await getConnection(alias);
    } catch (error) {
      console.error(error);
      throw new Error(error);
    }
  }
}

E um Modulo

import { Global, Module } from '@nestjs/common';
import { OracleProviderFactory } from './oracle.provider';
import { OracleService } from './oracle.service';

@Global()
@Module({
  providers: [OracleProviderFactory, OracleService],
  exports: [OracleService],
})
export class DatabaseModule { }

Ai no service que precisar da conexão, precisa injetar o Service criado para pegar uma conexão: Modulo de exemplo que vai usar a conexão com o banco

import { Module } from '@nestjs/common';
import { OracleService } from 'src/database/oracle/oracle.service';

@Module({
  controllers: [NotaFiscalController],
  providers: [OracleService],
  imports: [],
})
export class NotaFiscalModule {}

Service de Exemplo que vai utilizar a conexão com o banco

@Injectable()
export class NotaFiscalService {
  constructor(
    private readonly oracleService: OracleService,
  ) { }