首页 > 解决方案 > Heroku 无法与 Postgres DB/Knex/Express 连接

问题描述

我有一个 Express API 部署到 Heroku,但是当我尝试运行迁移时,它会引发以下错误:

heroku run knex migrate:latest Running knex migrate:latest on ⬢ bookmarks-node-api... up, run.9925(免费)使用环境:生产错误:在 TCPConnectWrap.afterConnect 连接 ECONNREFUSED 127.0.0.1:5432 [as oncomplete] (net.js:1117:14)

在我的knexfile.js,我有:

production: {
    client: 'postgresql',
    connection: {
      database: process.env.DATABASE_URL
    },
    pool: {
      min: 2,
      max: 10
    },
    migrations: {
      directory: './database/migrations'
    }
  }

我还尝试分配tableName: 'knex_migrations'引发错误的迁移目录:

heroku run knex migrate:latest Running knex migrate:latest on ⬢ bookmarks-node-api... up, run.7739(免费)使用环境:生产错误:ENOENT:没有这样的文件或目录,scandir '/app/migrations'

这是 Heroku 中设置的配置:

-node-api git:(master) heroku pg:info
=== DATABASE_URL
Plan:                  Hobby-dev
Status:                Available
Connections:           0/20
PG Version:            10.7
Created:               2019-02-21 12:58 UTC
Data Size:             7.6 MB
Tables:                0
Rows:                  0/10000 (In compliance)
Fork/Follow:           Unsupported
Rollback:              Unsupported

我认为问题在于,由于某种原因,它正在寻找localhost数据库,就好像正在读取环境,就development好像跟踪显示Using environment: production.

标签: postgresqlexpressherokuknex.js

解决方案


当您提供一个对象作为您的对象时,您connection将提供连接信息的各个部分。在这里,您是说您的名称database是包含在的所有内容process.env.DATABASE_URL

connection: {
  database: process.env.DATABASE_URL
},

您不提供值的任何键都将返回默认值。一个例子是host密钥,它默认为本地机器。

但是DATABASE_URL环境变量在一个字符串中包含了您需要连接的所有信息(主机、端口、用户、密码和数据库名称)。整个值应该是您的connection设置

connection: process.env.DATABASE_URL,

推荐阅读