无法使用sequelize从本地节点应用程序连接到heroku postgresql数据库

Iwa*_*aru 15 postgresql heroku node.js sequelize.js heroku-postgres

我正在尝试使用Sequelize从本地nodejs应用程序连接到Heroku postgresql数据库.我按照这两个指南,一切都在heroky服务器端工作得很好,但是当我在Mac上本地运行时,我的节点应用程序将无法连接到heroku.

以下是我启动本地应用的方法:

DATABASE_URL=$(heroku config:get DATABASE_URL) nodemon
Run Code Online (Sandbox Code Playgroud)

得到我:

Sequelize: Unable to connect to the database:
Run Code Online (Sandbox Code Playgroud)

但是通过这样做我得到了正确的URL:

echo $(heroku config:get DATABASE_URL)
Run Code Online (Sandbox Code Playgroud)

这些命令工作正常:

heroku pg:psql
psql $(heroku config:get DATABASE_URL)
Run Code Online (Sandbox Code Playgroud)

这是我的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);
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

我试图添加native: true到sequelize选项,但后来我得到:

    /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
Run Code Online (Sandbox Code Playgroud)

即使这样做了:

npm install pg
npm install -g pg
brew install postgresql
Run Code Online (Sandbox Code Playgroud)

这是顺便说一句:

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);
    });
});
Run Code Online (Sandbox Code Playgroud)

但我宁愿使用Sequelize.

Iwa*_*aru 38

好的,通过浏览sequelize源代码找到答案:https: //github.com/sequelize/sequelize/blob/master/lib/dialects/postgres/connection-manager.js#L39

要激活用于PG连接的SSL,您不需要native: true,ssl: truedialectOptions.ssl: true以下操作终于可以正常工作:

sequelize = new Sequelize(process.env.DATABASE_URL, {
    dialect: 'postgres',
    protocol: 'postgres',
    dialectOptions: {
        ssl: true
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 要修复“自签名证书”错误,请参阅此帖子:/sf/ask/4127550801/ (5认同)

Gio*_* P. 13

您不再需要解析DATABASE_URL env变量,有一个接受连接URL的Sequelize构造函数:

sequelize = new Sequelize(process.env.DATABASE_URL, {
    dialect: 'postgres',
    protocol: 'postgres',
    dialectOptions: {
        ssl: true
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 你已经回答了自己的问题(dialectOptions.ssl:true),我只是在它上面提供了一个更简单的解决方案 (4认同)

小智 8

一个需要在ssl下添加dialectOptions

 "development": {
    "username": process.env.DB_USERNAME,
    "password": process.env.DB_PASSWORD,
    "database": process.env.DB_NAME,
    "host": process.env.DB_HOST,
    "dialect": process.env.DB_DIALECT,
    "dialectOptions": {
        ssl: {
            require: true,
            rejectUnauthorized: false
        }
    }
},
Run Code Online (Sandbox Code Playgroud)

源是根据官方续集github