【发布时间】:2019-08-07 01:47:45
【问题描述】:
我正在尝试开始使用 knex.js,但无法进行迁移。 Knex 适用于我的 API 调用。这是我的设置:
knexfile.js
const env = process.env;
module.exports = {
client: 'mysql',
connection: {
host: env.DB_HOST,
database: env.DB_NAME,
user: env.DB_USER,
password: env.DB_PASSWORD,
port: env.PORT
},
pool: {
min: 0,
max: 50
},
migrations: {
directory: './db/migrations',
tableName: 'knex_migrations'
},
seeds: {
directory: './db/seeds'
}
};
knex.js
const config = require('../knexfile.js');
module.exports = require('knex')(config);
events.js
const express = require('express');
const router = express.Router();
const knex = require('../../db/knex.js');
// GET api/events
router.get('/', (req, res) => {
knex('events')
.then(events => { res.send(events) }
.catch(err => { console.log(err); })
});
module.exports = router;
然后我在迁移文件夹中有一个文件:
exports.up = function(knex) {
return knex.schema.createTable('users', function (t) {
t.increments('id').primary()
t.string('username').notNullable()
t.string('password').notNullable()
t.timestamps(false, true)
}).then(() => { console.log('created users table') })
.catch((err) => { throw err} )
.finally(() => { knex.destroy() })
};
exports.down = function(knex) {
return knex.schema.dropTableIfExists('users')
};
当我运行knex migrate:latest 时,我得到TimeoutError: Knex: Timeout acquiring a connection. The pool is probably full. Are you missing a .transacting(trx) call?
我知道以前有人问过类似的问题,但我似乎找不到任何可以说明我的特殊情况的问题。我尝试在 GET 请求的末尾添加 knex.destroy() ,但这似乎没有帮助(如果我在下面添加其他请求处理程序,它只会使连接不可用)。
我确实尝试在 GET 请求结束时检查 finally 子句中的 knex.client.pool。 numUsed 是 0,numFree 是 1,numPendingAcquires 和 numPendingCreates 都是 0。我觉得很奇怪 numFree 只是 1,因为我的 knexfile 指定了最大 50。非常感谢任何建议。
【问题讨论】:
-
让你的游泳池最小 0 对我来说有一种奇怪的味道。 knexfile 中的默认最小值为 2。我会使其至少为 2。
-
是的,当我第一次观察到这个问题时,我最初是在 2 点。我看到有些人建议将其设置为 0 以解决类似问题。对我来说似乎没有效果。
-
您的数据库与您运行 Knex 的系统是否在同一系统上(例如:本地主机)?可以通过MySQL's Shell联系吗?
-
它不在同一个系统上,不,它是一个远程数据库。我可以在上面的 GET 请求中与 knex 正常连接。我只是尝试通过 mysqlsh 进行连接并且连接正常,尽管我无法测试任何实际查询,因为我不熟悉 mysqlsh 并且无法完全弄清楚如何执行它们。不过,这给了我一个想法——我需要向
knex migrate调用添加凭据吗?我假设它是从我的knexfile中读取的,但如果不是这样,那也是有道理的。 -
是的,
knex migrate:latest可能会很棘手。 您必须与knexfile.js位于同一文件夹中才能使用 cli 界面。有一个 cli 选项可以指定路径,但通常我会建议将cd放在正确的目录中,因为您的故障排除。我不确定 cli 接口是否可以从 env 文件中读取。我见过有人这样做,但我从未尝试过。我想看看你是否可以在运行knex migrate:latest时在knexfile.js中控制台日志环境@
标签: node.js express connection-pooling knex.js