У меня есть 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.





Вы должны проверить, настроена ли надстройка Postgres, как описано в эти документы, поскольку DATABASE_URL автоматически устанавливается для вас, как указано здесь.
Я настроил базу данных postgres, как описано в документации heroku. Я не менял значение переменной, назначенной героку. Редактирование вопроса, чтобы показать heroku pg: config
Когда вы предоставляете объект в качестве своего connection, вы предоставляете отдельные части информации о соединении. Здесь вы говорите, что ваше имя database — это все, что содержится в process.env.DATABASE_URL:
connection: {
database: process.env.DATABASE_URL
},
Любые ключи, для которых вы не указали значения, возвращаются к значениям по умолчанию. Примером может служить клавиша host, которая по умолчанию используется для локального компьютера.
Но переменная среды DATABASE_URL содержит все информации, необходимой для подключения (хост, порт, пользователь, пароль и имя базы данных) в одной строке. Все это значение должно быть вашей настройкой connection:
connection: process.env.DATABASE_URL,
Heroku Postgres уже должен был установить эту переменную. Пользователь не выбирает учетные данные или хост; эти значения должны быть получены от существующей переменной среды. ОП, ты изменил значение этой переменной окружения?