web-dev-qa-db-ja.com

sequelizeを使用してローカルノードアプリからherokupostgresqlデータベースに接続できません

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を使用したいと思います。

15
Iwazaru

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
    }
});
36
Iwazaru

DATABASE_URL環境変数を解析する必要はなくなりました。接続URLを受け入れるSequelizeコンストラクターがあります。

sequelize = new Sequelize(process.env.DATABASE_URL, {
    dialect: 'postgres',
    protocol: 'postgres',
    dialectOptions: {
        ssl: true
    }
});
13
Giovanni P.

私も同じ問題を抱えていました。これらの場合、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
        }
    }
);

ここで、dialectOptionsssl: trueを考慮する必要があります。

あなたが知る必要があるのはそれだけです。

0
Ismael Terreno