我有以下在Node.js中的PostgreSQL连接文件:
// postgresql.js
"use strict";
const { Pool } = require('pg');
module.exports = new Promise((resolve, reject) => {
const pool = new Pool({
host: '127.0.0.1',
port: 5432,
user: 'postgres',
password: 'postgres',
database: 'postgres',
connectionTimeoutMillis: 0,
idleTimeoutMillis: 0,
min: 10,
max: 20,
});
resolve({ pool });
});
我正在使用 Promise,因为稍后我将开始使用 Google Cloud Secret Manager。这些秘密是异步获取的,因此当服务器启动时无法建立数据库连接。
在我的控制器文件中,我像这样使用它:
// apicontroller.js
"use strict";
const postgresql = require('./postgresql');
app.get('/api/test', async (req, res, next) => {
// resolve the postgresql promise
const { pool } = await postgresql;
// resolve the pool.connect() promise
const client = await pool.connect();
// use the client object here
// eg. await client.query(...)
});
问题并不在于它不能正常工作,相反,它的工作非常好!但我有疑问:我是在重复使用连接池,还是每次请求该路由时都创建了新的连接(池)?
这是否是仅重用数据库连接一次的正确方法?
编辑:我只包含相关的代码部分。
这是重复使用数据库连接的正确方法吗?
正如您在OP的问题中所看到的。而且,该问题中的示例还提供了异步调用的解决方案。 - hurricanegetPool
中引用单例模式,是的,那可能是我忽略的答案。而且,createPool
应该像OP代码中一样返回一个Promise。 - Bergi