使用Sequelize CLI迁移到DigitalOcean Postgres数据库引发SSL错误



当我不迁移时,使用Sequelize连接到我的DigitalOcean数据库可以很好地工作。例如,尝试创建一个新表的效果很好;下面的代码成功地连接并创建了一个新表。

sequelize = new Sequelize(config.use_env_variable, config);
sequelize.authenticate().then(console.log('success')).catch((error) => console.log(error));
sequelize.define('test-table', {
test_id: {
type: Sequelize.INTEGER,
},
});
sequelize.sync();

我有一个从DigitalOcean下载的CA证书.crt文件,我正在通过Sequelize选项传递该文件。我的config.js看起来像

development: {
use_env_variable: 'postgresql://[digitalocean_host_url]?sslmode=require',
ssl: true,
dialectOptions: {
ssl: {
require: true,
rejectUnauthorized: false,
ca: fs.readFileSync(`${__dirname}/../.postgresql/root.crt`),
},
},
},

但是,当我尝试使用迁移创建表时

npx sequelize-cli db:migrate

我收到以下输出和错误:

Parsed url postgresql://[digitalocean_host_url]?sslmode=require
ERROR: no pg_hba.conf entry for host [host], user [user], database [database], SSL off

这很奇怪,因为当我只使用Sequelize sync创建表时,SSL正在工作。我有一个用于sequelize-cli配置的.sequelizerc文件,它看起来像这样:

const path = require('path');
const env = process.env.NODE_ENV || 'development'
const config = require('./config/config')[env];
module.exports = {
'config': path.resolve('config', 'config.js'),
'url': config.use_env_variable,
'options-path': path.resolve('config', 'sql-options.json')
}

在我的sql-options.json中,我有以下

{
"use_env_variable": "postgresql://[digitalocean_host_url]?sslmode=require",
"dialect":"postgres",
"ssl": true,
"dialectOptions": {
"ssl": {
"required": true,
"rejectUnauthorized": true,
"ca": "/../.postgresql/root.crt"
}
}
}

我已经尝试了来自各种资源的许多建议,包括sequelize/cli repo。但这些似乎都不起作用。任何建议都会有帮助。

我也遇到了同样的问题,修复方法是在迁移配置文件中添加下面的代码,尽管数据库连接文件中已经有了它。以下代码位于config/config.js文件中,用于迁移。

production: {
username: ****,
password: ****,
database: ****,
host: ****,
dialect: ****,
port: ****,
dialectOptions: {
ssl: {
require: true,
rejectUnauthorized: false,
},
},
},

这就是我的数据库连接正常工作的样子。

const sequelize = new Sequelize({
host: ****,
database: ****,
username: ****,
password: ****,
dialect: ****,
port: ****,
dialectOptions: {
ssl: {
require: true,
rejectUnauthorized: false,
},
},
});

最新更新