Knex迁移在Postgres Heroku中出现错误:无法获取连接。

11

我正在尝试运行我的第一个迁移,它会在Heroku postgres数据库中创建一个单一的表。

当我尝试运行knex migrate:latest --env development时,我收到了以下错误:

  

错误:无法获取连接

我尝试过的事情:

  • ?ssl=true添加到存储在process.env.LISTINGS_DB_URL中的连接字符串的末尾,因为我知道这有时是与Heroku连接所需的条件之一。
  • 设置环境变量PGSSLMODE=require

我还偶然发现了这篇文章,其中有人评论说knex不接受基于环境的键。 然而,我正在尝试遵循这个教程,该教程表明它可以接受键。 我还看到了许多其他引用,这些引用强化了这一点。

我还要补充的是,我已经能够从我的应用程序和外部客户端连接到数据库。 我只在尝试运行knex迁移时遇到此错误。

此外,我尝试确定如何检查作为连接字符串发送的内容。 在查看knex文档时:

  

How do I debug FAQ

     

如果您将{debug: true}作为初始化设置中的选项之一传递,则可以看到正在进行的所有查询调用。

是否有人可以帮助指导我如何实际执行此操作? 或者我已经在我的knexfile.js中成功执行了吗?

相关文件:

// knex.js:

var environment = process.env.NODE_ENV || 'development';
var config = require('../knexfile.js')[environment];

module.exports = require('knex')(config);



// knexfile.js:

module.exports = {

    development: {
        client: 'pg',
        connection: process.env.LISTINGS_DB_URL,
        migrations: {
            directory: __dirname + '/db/migrations'
        },
        seeds: {
            directory: __dirname + '/db/seeds'
        },
        debug: true
    },

    staging: {
        client: 'postgresql',
        connection: {
            database: 'my_db',
            user: 'username',
            password: 'password'
        },
        pool: {
            min: 2,
            max: 10
        },
        migrations: {
            tableName: 'knex_migrations'
        }
    },

    production: {
        client: 'postgresql',
        connection: {
            database: 'my_db',
            user: 'username',
            password: 'password'
        },
        pool: {
            min: 2,
            max: 10
        },
        migrations: {
            tableName: 'knex_migrations'
        }
    }

};
6个回答

12

正如下方评论中@hhoburg所指出的那样,错误信息 Error: Unable to acquire a connection 是一个通用的消息,表明 Knex客户端配置 出现了问题。请参见此处

在我的情况下,Knex没有在 knexfile.js 中引用变量 process.env.LISTINGS_DB_URL,因为:

  • 该变量是在我的 .env 文件中设置的
  • dotenv模块没有被 Knex 引用/调用

正确的设置方式详见 knex 问题追踪器此处


3

步骤 1:

首先安装 dotenv:

npm i dotenv --save

在您的项目根目录中创建一个名为.env的文件,添加以下内容:
DATABASE_URL=postgres://...

第二步:

在你的knexfile.js文件开头,添加以下内容:

require('dotenv').config();

将Postgres连接更改为类似以下内容:

{
  client: 'postgresql',
  connection: process.env.DATABASE_URL,
  pool: {
    min: 0,
    max: 15
  },
  migrations: {
    directory: ...
  },
  seeds: {
    directory: ...
  }
}

你不应该在Heroku中使用dotenv,因为它提供了从UI和命令行设置环境变量的方式。 - aUXcoder

2
我不确定这是否有所帮助,但今天我在本地环境中遇到了同样的问题。经过漫长的搜索,我发现这是一个新的错误信息,提示连接配置无效或缺少连接池。经过长时间的尝试,我将连接切换为使用我的.env文件进行配置环境;我之前一直在我的knex.js文件中使用硬编码字符串('dev'),但由于某些原因它无法工作。
您的.env文件是否正常工作?您是否尝试更改池设置,并且您确定您的用户名和密码对于分别用于暂存和生产数据库是正确的吗?
希望这个链接能够帮到您!

谢谢!虽然它没有直接解决问题,但它确实让我将故障排除的重点放在环境配置上。我已经在我的项目中安装了dotenv,但是当使用cli进行迁移时,knex没有引用它。一次“knex和dotenv”的搜索带我去了https://github.com/tgriesser/knex/issues/590,那里有答案。 - HendPro12

1

如果您在Node.js中遇到此错误,请尝试删除此行

myDb.destroy().then();

0

在运行相应的迁移之前,我尝试将数据更新到数据库时遇到了这个错误。


0
我在同样的情况下收到了这个错误。原来是在迁移之前我忘记了预配数据库,所以没有可以连接的内容。
为了解决这个错误,
在运行之前:
heroku run knex migrate:latest

我执行了这个命令:
heroku addons:create heroku-postgresql

这个很好地运作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接