2017-12-27 2320 views
1

我試圖使用pg,一個Postgres客戶端的節點。在這些例子中,它使用下面的代碼:在節點全局範圍內使用await加載數據庫客戶端可能嗎?

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() 

我瞭解異步/ AWAIT函數的語法要求你寫伺機聲明爲異步函數內的語句。但是,通常在連接數據庫客戶端時,將其連接到函數之外並在全局範圍內。是否有任何使用異步函數而不必將客戶端封裝在函數中的最佳實踐?

看來,使用這種語法,我們不得不訴諸類似以下內容:

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

相關問題