在节点全局范围内使用await加载数据库客户端可能吗?

我试图使用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()

}

也许我错过在我的理解的东西在这里。

回答:

但是,通常在连接数据库客户端时,可以将它连接到函数之外并在全局范围内。有没有最佳做法..?

您可以使用连接池技术

对于使用连接池的最佳实践的缘故。尝试在应用程序中实现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

以上是 在节点全局范围内使用await加载数据库客户端可能吗? 的全部内容, 来源链接: utcz.com/qa/266869.html

回到顶部