KnexTimeoutError: Knex: Timeout acquiring a connection
KnexTimeoutError: Knex: Timeout acquiring a connection
连接到 knex 时出现以下错误:
KnexTimeoutError:Knex:获取连接超时。游泳池可能已满。您是否错过了 .transacting(trx) 电话?
这是我的代码:
Api.js
const Knex = require('knex');
const config = require('./config');
const configuration = {
user: config.config.sqlUser, // e.g. 'my-user'
password: config.config.sqlPw, // e.g. 'my-user-password'
database: config.config.sqlDbName, // e.g. 'my-database'
};
configuration.host = `${config.config.sqlConnectionName}`;
const knex = Knex({client: 'pg', connection: configuration});
knex.client.pool.max = 5;
knex.client.pool.min = 5;
knex.client.pool.createTimeoutMillis = 30000; // 30 seconds
knex.client.pool.idleTimeoutMillis = 600000; // 10 minutes
knex.client.pool.createRetryIntervalMillis = 200; // 0.2 seconds
knex.client.pool.acquireTimeoutMillis = 600000; // 10 minutes
router.get('/things', async (req, res) =>{
await methods.getThings(req, res, knex);
});
methods.js:
exports.getThings = async (req, res, knex) => {
let response = {};
try{
console.log("knex.client.pool.max");
console.log(knex.client.pool.max);
response = await knex.select('id', 'userUid', 'firstName', 'lastName', 'cv', 'statement', 'country', 'represented').from('things').where('approved',true)
}
catch (err){
console.log("error: ", err);
return res.status(500).json(err);
}
return res.status(200).json(response)
}
我正在使用这些:
节点 v14.0.0
页面“8.7.1”
膝盖“0.95.14”
似乎是创建到云 sql 的连接(日志中的 30 秒超时)时出现问题。如何正确创建连接?我应该使用云代理吗?如何使用?
我在 VM 中有一个启动脚本,用于启动 node express 服务器。
此错误可能意味着很多事情,但这就是开始的地方:
首先,它也可能是由您 database host name
中的 typo
引起的,因此请检查您的凭据 两次 !
属性 propagateCreateError
应设置为 false
以防止超时获取连接。游泳池可能已满。尝试将此行添加到您的 pool configuration
。同时更改 min
和 max
例如2-6祝你好运!
knex.client.pool.propagateCreateError = false;
如果您运行在 VM 上运行此应用程序,您还需要 运行 Cloud SQL Auth Proxy 作为一个单独的进程。
您将使用如下内容启动代理:
cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:5432
然后您的应用程序可以连接到 127.0.0.1(而不是 sqlConnectionName
)。
"express": "^4.16.2",
"knex": "^0.14.2",
"objection": "^2.1.3",
"pg": "^8.0.3",
和 npm 安装
我解决了我的问题(第 4 天结束)
连接到 knex 时出现以下错误: KnexTimeoutError:Knex:获取连接超时。游泳池可能已满。您是否错过了 .transacting(trx) 电话?
这是我的代码:
Api.js
const Knex = require('knex');
const config = require('./config');
const configuration = {
user: config.config.sqlUser, // e.g. 'my-user'
password: config.config.sqlPw, // e.g. 'my-user-password'
database: config.config.sqlDbName, // e.g. 'my-database'
};
configuration.host = `${config.config.sqlConnectionName}`;
const knex = Knex({client: 'pg', connection: configuration});
knex.client.pool.max = 5;
knex.client.pool.min = 5;
knex.client.pool.createTimeoutMillis = 30000; // 30 seconds
knex.client.pool.idleTimeoutMillis = 600000; // 10 minutes
knex.client.pool.createRetryIntervalMillis = 200; // 0.2 seconds
knex.client.pool.acquireTimeoutMillis = 600000; // 10 minutes
router.get('/things', async (req, res) =>{
await methods.getThings(req, res, knex);
});
methods.js:
exports.getThings = async (req, res, knex) => {
let response = {};
try{
console.log("knex.client.pool.max");
console.log(knex.client.pool.max);
response = await knex.select('id', 'userUid', 'firstName', 'lastName', 'cv', 'statement', 'country', 'represented').from('things').where('approved',true)
}
catch (err){
console.log("error: ", err);
return res.status(500).json(err);
}
return res.status(200).json(response)
}
我正在使用这些: 节点 v14.0.0 页面“8.7.1” 膝盖“0.95.14”
似乎是创建到云 sql 的连接(日志中的 30 秒超时)时出现问题。如何正确创建连接?我应该使用云代理吗?如何使用?
我在 VM 中有一个启动脚本,用于启动 node express 服务器。
此错误可能意味着很多事情,但这就是开始的地方:
首先,它也可能是由您 database host name
中的 typo
引起的,因此请检查您的凭据 两次 !
属性 propagateCreateError
应设置为 false
以防止超时获取连接。游泳池可能已满。尝试将此行添加到您的 pool configuration
。同时更改 min
和 max
例如2-6祝你好运!
knex.client.pool.propagateCreateError = false;
如果您运行在 VM 上运行此应用程序,您还需要 运行 Cloud SQL Auth Proxy 作为一个单独的进程。
您将使用如下内容启动代理:
cloud_sql_proxy -instances=<INSTANCE_CONNECTION_NAME>=tcp:5432
然后您的应用程序可以连接到 127.0.0.1(而不是 sqlConnectionName
)。
"express": "^4.16.2",
"knex": "^0.14.2",
"objection": "^2.1.3",
"pg": "^8.0.3",
和 npm 安装 我解决了我的问题(第 4 天结束)