在节点全局范围内使用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