node.js - 迁移时 Knex 池已满

标签 node.js express connection-pooling knex.js

我正在尝试开始使用 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 getting a connection。泳池可能已经满了。您是否错过了 .transacting(trx) 调用?

我知道以前曾有人问过类似的问题,但我似乎找不到任何可以阐明我的特殊情况的问题。我尝试在 GET 请求末尾添加 knex.destroy() ,但这似乎没有帮助(如果我在下面添加其他请求处理程序,它只会使连接无法使用)。

我确实尝试在 GET 请求末尾的 finally 子句中检查 knex.client.poolnumUsed 为 0,numFree 为 1,numPendingAcquiresnumPendingCreates 均为 0。考虑到我的 knexfile 指定最大值为 50,我确实觉得 numFree 只有 1 很奇怪。非常感谢任何建议。

最佳答案

根据 @technogeek1995 的评论,答案是将 require('dotenv').config({path: '../.env'}); 添加到 knexfile.js (回想起来,这部分似乎很明显),并从同一目录运行 cli。希望这对其他人有帮助。

关于node.js - 迁移时 Knex 池已满,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57385973/

相关文章:

node.js - 如何在 'message' 监听器上删除 Redis

node.js - 使用强大的 Node 文件上传不起作用

arrays - 在 NodeJS 中按值排序数组

node.js - 使用 socket.io 配置 Express 4.0 路由

node.js - 在graphql中获取复杂对象的字段类型错误

node.js - 在 Node/Express 的异步函数中捕获错误

node.js - 如何使用 Handlebars 更改 Express 中的默认布局?

tomcat - 无法理解使用 JPA、Tomcat、Oracle 的连接池错误

java - 连接池泄漏原因

phpcassa连接池