Sequelizeを使用してローカルnodejsアプリからHerokupostgresqlデータベースに接続しようとしています。この2つのガイドに従って、すべてが英雄的なサーバー側で完全に正常に機能していますが、Macでローカルに実行するとノードアプリがherokuに接続しません。
ローカルアプリを起動する方法は次のとおりです。
DATABASE_URL=$(heroku config:get DATABASE_URL) nodemon
私を取得します:
Sequelize: Unable to connect to the database:
しかし、私はこれを行うことによって正しいURLを取得します:
echo $(heroku config:get DATABASE_URL)
そして、これらのコマンドは正常に機能しています。
heroku pg:psql
psql $(heroku config:get DATABASE_URL)
これが私のnodejsコードです:
var match = process.env.DATABASE_URL.match(/postgres:\/\/([^:]+):([^@]+)@([^:]+):(\d+)\/(.+)/)
sequelize = new Sequelize(match[5], match[1], match[2], {
dialect: 'postgres',
protocol: 'postgres',
port: match[4],
Host: match[3],
logging: false
})
sequelize
.authenticate()
.complete(function(err) {
if (!!err) {
log('Sequelize: Unable to connect to the database:', err);
} else {
http.listen(process.env.PORT || config.server.port, function(){
log('Web server listening on port '+process.env.PORT || config.server.port);
});
}
});
続編オプションにnative: true
を追加しようとしましたが、次のようになります。
/Users/clement/Projets/XMM/node_modules/sequelize/lib/sequelize.js:188
throw new Error('The dialect ' + this.getDialect() + ' is not supported.
^
Error: The dialect postgres is not supported. (Error: Please install postgres package manually)
at new module.exports.Sequelize (/Users/clement/Projets/XMM/node_modules/sequelize/lib/sequelize.js:188:13)
at Object.<anonymous> (/Users/clement/Projets/XMM/server.js:17:14)
at Module._compile (module.js:456:26)
at Object.Module._extensions..js (module.js:474:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Function.Module.runMain (module.js:497:10)
at startup (node.js:119:16)
at node.js:929:3
行った後でも:
npm install pg
npm install -g pg
brew install postgresql
ちなみにこれは機能しています:
var pg = require('pg');
pg.connect(process.env.DATABASE_URL+'?ssl=true', function(err, client, done) {
if (err) return console.log(err);
client.query('SELECT * FROM pg_catalog.pg_tables', function(err, result) {
done();
if(err) return console.error(err);
console.log(result.rows);
});
});
しかし、私はむしろSequelizeを使用したいと思います。
OK、sequelizeのソースコードを参照して答えを見つけました: https://github.com/sequelize/sequelize/blob/master/lib/dialects/postgres/connection-manager.js#L39
PG接続のSSLをアクティブ化するには、native: true
またはssl: true
は必要ありませんがdialectOptions.ssl: true
であるため、最終的に次のように機能しました。
sequelize = new Sequelize(process.env.DATABASE_URL, {
dialect: 'postgres',
protocol: 'postgres',
dialectOptions: {
ssl: true
}
});
DATABASE_URL環境変数を解析する必要はなくなりました。接続URLを受け入れるSequelizeコンストラクターがあります。
sequelize = new Sequelize(process.env.DATABASE_URL, {
dialect: 'postgres',
protocol: 'postgres',
dialectOptions: {
ssl: true
}
});
私も同じ問題を抱えていました。これらの場合、herokuデータベースに接続する方法に関する次のドキュメントの例を検討できます。
https://sequelize.readthedocs.io/en/1.7.0/articles/heroku/
最後に、私は次のようなコードを実装しました:
const sequelize = new Sequelize(
process.env.DATABASE_NAME_DB_CONFIG,
process.env.USER_NAME_DB_CONFIG,
process.env.USER_PASSWORD_DB_CONFIG,
{
Host: process.env.Host_DB_CONFIG,
dialect: process.env.DIALECT_DB_CONFIG,
protocol: process.env.PROTOCOL_DB_CONFIG,
logging: true,
dialectOptions: {
ssl: true
},
pool: {
max: 5,
min: 0,
idle: 10000
}
}
);
ここで、dialectOptionsとssl: true
を考慮する必要があります。
あなたが知る必要があるのはそれだけです。