2017-12-27 13 views
1

노드 용 Postgres 클라이언트 인 pg을 사용하려고합니다. 비동기/await를 함수 구문은 당신이 비동기로 선언되는 함수 내에서 문을 기다리고 작성하는 것이 필요내부 노드 전역 범위를 사용하여 db 클라이언트를로드 할 수 있습니까?

const { Client } = require('pg') 
const client = new Client() 

await client.connect() 

const res = await client.query('SELECT $1::text as message', ['Hello world!']) 
console.log(res.rows[0].message) // Hello world! 
await client.end() 

이해 : 예에서, 다음과 같은 코드를 사용합니다. 그러나 일반적으로 데이터베이스 클라이언트를 연결할 때 함수 외부와 전역 범위에 연결합니다. 함수 안에 클라이언트를 래핑 할 필요없이 비동기 함수를 사용하는 가장 좋은 방법이 있습니까?

그 구문을 사용하는 것, 우리는 다음과 같이 뭔가에 의지해야 할 것 :

const { Client } = require('pg'); 
const client = new Client(); 

async connectClient (client) { 
    await client.connect(); 
    return client; 
} 

async disconnectClient(client) { 
    await client.end() 
} 

은 아마 내가 여기 내 이해에서 뭔가 빠진거야.

+0

문제가 해결되었는지 확인하십시오. @steviejay – gokcand

+0

@ GökcanD 솔루션은 확실히 작동하지만 다른 대안이 있는지 계속 확인하고 싶습니다. 특히 OOP 설계 요소에 의지 할 필요없이 – steviejay

답변

1

그러나 일반적으로 데이터베이스 클라이언트를 연결할 때 함수 및 전역 범위 외부에 연결합니다. 모범 사례가 있습니까 ..?

당신은 연결 풀링을 사용하는 모범 사례를 위해서 기술

풀링 연결을 사용할 수 있습니다. 응용 프로그램에 OOP 디자인 요소를 구현하십시오. 클래스 및 상속과 같은. 기본 클래스 Service 연장

Service.ts

import { Pool } from 'pg'; 

export class Service { 
    protected pool: Pool; 

    constructor() { 
    this.pool = new Pool({ 
     database: process.env.DB_DATABASE, 
     host: process.env.DB_HOST, 
     password: process.env.DB_PASS, 
     port: process.env.DB_PORT, 
     user: process.env.DB_USER, 
    }); 
    } 

예시적인 서비스 클래스 :

AuthnService.ts을

export class AuthService extends Service { 
    private key: string; 

    constructor() { 
    super(); 
    this.key = process.env.SECRET_KEY; 
    } 
    // Example async function that shows the usage of pg with async/await 
    public async isUserExists(username: string, email?: string): Promise<boolean> { 
    const client = await this.pool.connect(); //Pool is now accessible over here 
    try { 
     let res = await client.query('SELECT * FROM users WHERE username = $1', [ username ]); 
     if (res.rows[0]) { 
     return res.rows[0]; 
     } else if (email) { 
     res = await client.query('SELECT * FROM users WHERE email = $1', [ email ]); 
     if (res.rows[0]) { 
      return res.rows[0]; 
     } 
     } 
    } catch (e) { 
     throw new Error(e); 
    } finally { 
     client.release(); // Release for other connections to use 
    } 
    return false; 
     } 
    } 
} 

추가 정보 : node-postgres docs

,