在使用Node.js创建Postgres数据库时出现错误

3

我正在学习Node,并尝试使用Express创建服务器并将其连接到Postgres数据库,但在运行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。我需要在命令行中创建一个新的数据库,然后运行$psql来创建用户名/密码吗?难道数据库不应该自动创建吗?
3个回答

3

您可以使用

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

要连接到postgresql数据库,但sequelize不会为您创建用户或数据库。 您必须自己完成此操作。使用createusercreatedb postgres实用程序来创建它们,或使用psql命令的-c标志。您还必须具有执行此操作的权限,因此在下一个示例命令中使用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'\""

谢谢Alex。我在我的代码中如何使用postgres/sequelize的createuser/createdb?难道我不需要使用sequelize来使用'pg'包中的工具吗?你是怎么做到的?对不起,我对这个堆栈/postgres还不熟悉。我假设一旦我使用了createuser/createdb工具,我可以通过psql访问数据库,对吗?感谢您的帮助。我真的希望有一个解释MEAN堆栈与postgres的教程。 - rahul2001

0

虽然Sequelize没有创建数据库的方法,但你可以使用create query方法来执行自定义方法。

但问题是:

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

在这种情况下,你无法做到这一点,因为首先你想要创建的就是那个数据库。

有一种简单的方法可以解决这个问题。Postgress有两个内置的模板数据库,分别叫做template0和template1,它们不能被删除。了解更多关于模板数据库的信息

所以你只需要在连接字符串中连接到template1(而不是template0)即可。

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

执行sequelize查询方法,并使用create查询命令。
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))

-1

我没有看到数据库自动创建。当我使用sequelize.js时,通常会在虚拟机中运行它,并使用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

你能解释一下你是如何做到这一点的吗?“当我使用sequelize.js时,通常会在一个虚拟机中运行它,该虚拟机具有一个puppet清单来断言数据库已经存在。” - rahul2001

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接