Heroku не может подключиться к Postgres DB/Knex/Express

У меня есть Express API, развернутый в Heroku, но когда я пытаюсь запустить миграцию, возникает следующая ошибка:

heroku run knex migrate:latest Running knex migrate:latest on ⬢ bookmarks-node-api... up, run.9925 (Free) Using environment: production Error: connect ECONNREFUSED 127.0.0.1:5432 at TCPConnectWrap.afterConnect [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 (Free) Using environment: production Error: ENOENT: no such file or directory, 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.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 666
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы должны проверить, настроена ли надстройка Postgres, как описано в эти документы, поскольку DATABASE_URL автоматически устанавливается для вас, как указано здесь.

Heroku Postgres уже должен был установить эту переменную. Пользователь не выбирает учетные данные или хост; эти значения должны быть получены от существующей переменной среды. ОП, ты изменил значение этой переменной окружения?

Chris 21.02.2019 15:40

Я настроил базу данных postgres, как описано в документации heroku. Я не менял значение переменной, назначенной героку. Редактирование вопроса, чтобы показать heroku pg: config

user2799827 21.02.2019 16:42
Ответ принят как подходящий

Когда вы предоставляете объект в качестве своего connection, вы предоставляете отдельные части информации о соединении. Здесь вы говорите, что ваше имя database — это все, что содержится в process.env.DATABASE_URL:

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

Любые ключи, для которых вы не указали значения, возвращаются к значениям по умолчанию. Примером может служить клавиша host, которая по умолчанию используется для локального компьютера.

Но переменная среды DATABASE_URL содержит все информации, необходимой для подключения (хост, порт, пользователь, пароль и имя базы данных) в одной строке. Все это значение должно быть вашей настройкой connection:

connection: process.env.DATABASE_URL,

Другие вопросы по теме