尝试在Node.js中创建Postgres DB时出错

时间:2015-03-03 07:02:44

标签: javascript node.js postgresql sequelize.js

我正在学习Node并尝试使用Express创建服务器并将其连接到postgres db并在运行node server.js时继续获得以下内容:

events.js:72
        throw er; // Unhandled 'error' event
              ^
error: role "username" does not exist
    at Connection.parseE (/Users/rs/Desktop/Jobletics/node_modules/pg/lib/connection.js:526:11)
    at Connection.parseMessage (/Users/rs/Desktop/Jobletics/node_modules/pg/lib/connection.js:356:17)
    at Socket.<anonymous> (/Users/rs/Desktop/Jobletics/node_modules/pg/lib/connection.js:105:22)
    at Socket.emit (events.js:95:17)
    at Socket.<anonymous> (_stream_readable.js:764:14)
    at Socket.emit (events.js:92:17)
    at emitReadable_ (_stream_readable.js:426:10)
    at emitReadable (_stream_readable.js:422:5)
    at readableAddChunk (_stream_readable.js:165:9)
    at Socket.Readable.push (_stream_readable.js:127:10)

我的server.js文件如下所示:

// app dependencies
var express = require("express");
var Sequelize = require("sequelize");
var bodyParser = require('body-parser');
var morgan = require('morgan');
var app = express();


//middleware
app.use(bodyParser());
app.use(morgan('dev'));

//sequalize initialization
var sequelize = new Sequelize("postgres://username:password@localhost:5432/jobletics");
var employerRoute = require("./routes/employer")(sequelize);

//sync the model with the database
sequelize.sync().success(function (err) {
    app.get("/employer", employerRoute.get);
    app.post("/employer", employerRoute.create);
    app.listen(5000);
});

我有postgres在运行。我是否需要在命令行中创建一个新的db然后运行$ psql来创建用户名/密码?不应该自动创建数据库吗?

3 个答案:

答案 0 :(得分:2)

您可以使用

var sequelize = new Sequelize("postgres://username:password@localhost:5432/jobletics");

用于连接到postgresql数据库,但sequelize不会为您创建用户或数据库。你必须自己做。使用createusercreatedb postgres实用程序创建它们,或使用-c psql命令的用户postgres标记。您还必须有权执行此操作,因此在下一个示例中,使用su postgres -c "psql -U postgres -c \"CREATE USER username WITH ENCRYPTED PASSWORD 'password'\"" su postgres -c "psql -U postgres -c \"CREATE DATABASE jobletics WITH OWNER=username ENCODING='UTF8'\"" user:

运行命令
{{1}}

答案 1 :(得分:0)

我没有看到自动创建数据库。当我使用sequelize.js时,我通常在一个vm中运行它,它有一个puppet清单断言数据库已经存在。

另外,当谈到连接数据库时,我通常会这样做,因为我觉得它更容易阅读:

var Sequelize = require("sequelize");

var sequelize = new Sequelize(
    "dbName",
    "username",
    "password",
    {
         "dialect": "postgres",
         "port": 5423
    }
);

最后,确保你的package.json中存在postgres,如果不存在,则必须运行以下命令: npm install --save pg pg-hstore

答案 2 :(得分:0)

尽管Sequelize没有创建数据库的方法,但是您可以使用create query方法执行自定义方法。

但要注意的是,

  

您需要“连接到数据库”才能执行任何命令

在这里您不能执行此操作,因为您首先要创建的是数据库创建命令。

有一种简单的方法可以解决此问题。 Postgress有两个无法删除的内置模板DB,分别称为template0和template1。 More on template databases here

因此,您要做的就是在连接字符串中连接到template1(不是template0)

const sequelize = new Sequelize('postgres://username:password@localhost:5432/template1')

并使用create query命令执行sequelize查询方法

const createQuery = "CREATE DATABASE YOUR_DB_NAME WITH  OWNER = postgres ENCODING = 'UTF8' LC_COLLATE = 'English_United States.1252' LC_CTYPE = 'English_United States.1252' TABLESPACE = pg_default CONNECTION LIMIT = -1;"
sequelize.query(createQuery)
    .then(() => console.log("DB created"))
    .catch(err => console.log("error creating DB", err))