postgres Heroku 中的 Knex 迁移 - 错误:无法获取连接

问题描述 投票:0回答:7

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

当我尝试运行时

knex migrate:latest --env development
我收到错误

错误:无法获取连接

我尝试过的事情:

  • ?ssl=true
    添加到存储在
    process.env.LISTINGS_DB_URL
    中的连接字符串末尾,因为我知道这有时是与 heroku 连接的要求
  • 设置环境变量
    PGSSLMODE=require

我还偶然发现了这篇文章,其中有人评论说 knex 不会根据环境接受密钥。但是,我尝试按照本教程进行操作,这表明它确实如此。我还看到了许多其他参考资料,它们再次强化了这一点。

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

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

如何调试常见问题

如果您将 {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'
        }
    }

};
node.js heroku database-migration knex.js heroku-postgres
7个回答
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://...

第2步:

knexfile.js
的开头添加:

require('dotenv').config();

将 postgres 连接更改为:

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

2
投票

我不确定这是否有帮助,但我今天在本地环境中开始遇到同样的问题。经过大量搜索后,我发现这是新的错误消息,表示连接配置无效或缺少连接池。在摆弄了太长时间之后,我切换了连接以使用我的 .env 文件作为配置环境;我一直在 knex.js 文件中使用硬编码字符串('dev'),但由于某种原因它不起作用。

您的 .env 文件工作正常吗?您是否尝试过修改池设置,并且您确定您的登台数据库和生产数据库的用户名和密码正确吗?

我希望该链接有帮助!


1
投票

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

myDb.destroy().then();

0
投票

我在同样的情况下收到了同样的错误。结果我忘记在迁移之前配置数据库,因此没有任何可连接的内容。

要修复此错误,

跑步前:

heroku run knex migrate:latest

我运行了这个命令:

heroku addons:create heroku-postgresql

效果很好。


0
投票

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


0
投票

我意识到在 Nodejs 中 env 变量是不可读的,所以你需要安装 dotenv 并配置它。我执行了以下步骤并且成功了。希望这对遇到问题的人有帮助

第1步:

npm i dotenv --save

第2步:创建.env文件并添加变量

//.env
DATABASE_URL=postgresql://postgres:[email protected]:5432/db_name

第3步:添加点环境配置

//server.js
require("dotenv").config();
© www.soinside.com 2019 - 2024. All rights reserved.