A flexible module to provide node-postgres interface in NextJS.
npm install @nestjs-kitchen/connextion-postgres
!NPM License

A flexible module to provide node-postgres interface in NextJS.
---
- ✅ Transaction support
- ✅ High availability (HA) support
- ✅ Type intelligent
``bash`
$ npm install --save @nestjs-kitchen/connextion @nestjs-kitchen/connextion-postgres pg @types/pg
1. Export module, service & decorator.
`typescript`
export const { Postgres, PostgresModule, Transaction } = definePostgres();
export type Postgres = InstanceType
2. Register postgres connection instance with options.
`typescriptdefault
@Module({
imports: [
// By default it will register a connection instance called .`
PostgresModule.register({
// default's options...
})
],
providers: [SampleService]
})
export class SampleModule {}
3. Inject Postgres service.
`typescriptselect 1=1;
import { Postgres } from './file-that-exported-postgres';
@Injectable()
class SampleService {
constructor(
private readonly postgres: Postgres,
) {}
async sampleMethod() {
const result1 = await this.postgres.default.query();`
}
}
1. Define postgres connection instance names and export module, service & decorator.
e.g.: instance_1,instance_2.
`typescript`
export const { Postgres, PostgresModule, Transaction } = definePostgres<'instance_1' | 'instance_2'>();
export type Postgres = InstanceType
2. Register postgres connection instances with options.
`typescript`
@Module({
imports: [
PostgresModule.register({
connections: [
{
name: 'instance1',
// instance_1's options...
},
{
name: 'instance2',
// instance_2's options...
}
]
})
],
providers: [SampleService]
})
export class SampleModule {}
3. Inject Postgres service.
`typescriptselect 1=1;
import { Postgres } from './file-that-exported-postgres';
@Injectable()
class SampleService {
constructor(
private readonly postgres: Postgres,
) {}
async sampleMethod() {
const result1 = await this.postgres.instance1.query();`
}
}
`typescript
import { Query } from 'pg';
import { Postgres } from './file-that-exported-postgres';
@Injectable()
class SampleService {
constructor(
private readonly postgres: Postgres
) {}
async sampleMethod() {
const query = new Query('select $1::text as name', ['brianc']);
const result = await this.postgres.default.query(query);
result.on('row', (row) => {
console.log('row!', row); // { name: 'brianc' }
})
}
}
`
Apply transaction on all postgres connection instances:
`typescript
import { Postgres, Transaction } from './file-that-exported-postgres';
@Injectable()
class SampleService {
constructor(
private readonly postgres: Postgres
) {}
// Supposes we have connection instances: instance1 and instance2.instance1
// By default it will enable transaction for both and instance2 if not specified.select 1=1;
@Transaction()
async sampleMethod() {
const result = await this.postgres.instance1.query();`
}
}
Apply transaction on specified postgres connection instances:
`typescript
import { Postgres, Transaction } from './file-that-exported-postgres';
@Injectable()
class SampleService {
constructor(
private readonly postgres: Postgres
) {}
// Supposes we have connection instances: instance1 and instance2.instance1
// It will enable transaction for as specified.instance1
@Transaction()select 1=1;
async sampleMethod() {
const result = await this.postgres.instance1.query();`
}
}
Register postgres connection instance with multiple host.
When enabled, instance1 will attempt to connect db with each hosts/ports in sequence until a connection is successfully established.
Note: This is a temporary workaround and will change once node-postgres internally supports multiple hosts.
`typescript``
@Module({
imports: [
PostgresModule.register({
connections: [
{
name: 'instance1',
hosts: [
{
host: 'instance_1_host_1',
port: 1
},
{
host: 'instance_1_host_2',
port: 2
}
]
}
]
})
],
providers: [SampleService]
})
export class SampleModule {}
MIT License