如何通过Node.js与Postgres建立连接


123

我发现自己试图创建一个postgres数据库,所以我安装了postgres并使用启动了服务器initdb /usr/local/pgsql/data,然后用postgres -D /usr/local/pgsql/data现在启动了该实例,该如何通过节点与之交互?例如,将会connectionstring是什么,或者我如何能够找到它是什么。

Answers:


313

这是我用来将node.js连接到我的Postgres数据库的示例。

我使用的node.js中的界面可以在这里https://github.com/brianc/node-postgres

var pg = require('pg');
var conString = "postgres://YourUserName:YourPassword@localhost:5432/YourDatabase";

var client = new pg.Client(conString);
client.connect();

//queries are queued and executed one after another once the connection becomes available
var x = 1000;

while (x > 0) {
    client.query("INSERT INTO junk(name, a_number) values('Ted',12)");
    client.query("INSERT INTO junk(name, a_number) values($1, $2)", ['John', x]);
    x = x - 1;
}

var query = client.query("SELECT * FROM junk");
//fired after last row is emitted

query.on('row', function(row) {
    console.log(row);
});

query.on('end', function() {
    client.end();
});



//queries can be executed either via text/parameter values passed as individual arguments
//or by passing an options object containing text, (optional) parameter values, and (optional) query name
client.query({
    name: 'insert beatle',
    text: "INSERT INTO beatles(name, height, birthday) values($1, $2, $3)",
    values: ['George', 70, new Date(1946, 02, 14)]
});

//subsequent queries with the same name will be executed without re-parsing the query plan by postgres
client.query({
    name: 'insert beatle',
    values: ['Paul', 63, new Date(1945, 04, 03)]
});
var query = client.query("SELECT * FROM beatles WHERE name = $1", ['john']);

//can stream row results back 1 at a time
query.on('row', function(row) {
    console.log(row);
    console.log("Beatle name: %s", row.name); //Beatle name: John
    console.log("Beatle birth year: %d", row.birthday.getYear()); //dates are returned as javascript dates
    console.log("Beatle height: %d' %d\"", Math.floor(row.height / 12), row.height % 12); //integers are returned as javascript ints
});

//fired after last row is emitted
query.on('end', function() {
    client.end();
});

更新:- query.on现在不推荐使用该函数,因此上述代码无法按预期运行。作为解决方案,请看:-query.on不是函数


24
现在多数民众赞成在我喜欢的例子类型。清晰且包含足够的代码。谢谢JustBob。
Stradas,2012年

1
您在pg_hba.conf中添加了哪些内容以允许来自node.js的连接?谢谢
Marius 2012年

3
主机全部全部0.0.0.0/0 md5如果我记得正确的话,请允许任何IP连接。请记住,这不是特定于节点的,而是特定于PostgreSQL的。同样在postgresql.conf中,我有listen_addresses ='*'。对于生产设置,请通读文档以确保您没有在任何地方开孔。我在开发设置中使用了此功能,因此可以连接任何计算机。
Kuberchaun 2012年

1
阐明的conString参数是个天才,正是我想要的。谢谢!
nelsonenzo


33

一种现代而简单的方法:pg-promise

const pgp = require('pg-promise')(/* initialization options */);

const cn = {
    host: 'localhost', // server name or IP address;
    port: 5432,
    database: 'myDatabase',
    user: 'myUser',
    password: 'myPassword'
};

// alternative:
// var cn = 'postgres://username:password@host:port/database';

const db = pgp(cn); // database instance;

// select and return a single user name from id:
db.one('SELECT name FROM users WHERE id = $1', [123])
    .then(user => {
        console.log(user.name); // print user name;
    })
    .catch(error => {
        console.log(error); // print the error;
    });

// alternative - new ES7 syntax with 'await':
// await db.one('SELECT name FROM users WHERE id = $1', [123]);

另请参阅:如何正确声明数据库模块


尽管此链接可以回答问题,但最好在此处包括答案的基本部分并提供链接以供参考。如果链接的页面发生更改,仅链接的答案可能无效。
2015年

1
在理想的世界中-是的,但是,如上面您所看到的,此处接受的答案-只是链接。与那里一样,从链接提供的信息中提取一个摘要是太多了,并且考虑到两个链接都提供给GitHub的公共存储库,因此它们失效的机会不超过StackOverflow失效的机会。 。
vitaly-t 2015年

也许只是提供一个简单的示例,将其用于非常基本的东西,它只需要占用几行,但足以使其不成为仅链接。
澳洲航空94重型

@ Qantas94Heavy,我刚刚做了,请推迟投票:)
vitaly-t 2015年

@ vitaly-t:有人可能将帖子标记为“质量很差”,如果在处理标记之前对帖子进行了编辑或删除,该帖子将自动被拒绝。
澳洲航空94年重型

12

只是添加了一个不同的选项-我使用Node-DBI连接到PG,也是由于能够与MySQL和sqlite进行通信。Node-DBI还包括用于构建select语句的功能,该功能对于动态处理动态数据非常方便。

快速样本(使用存储在另一个文件中的配置信息):

var DBWrapper = require('node-dbi').DBWrapper;
var config = require('./config');

var dbConnectionConfig = { host:config.db.host, user:config.db.username, password:config.db.password, database:config.db.database };
var dbWrapper = new DBWrapper('pg', dbConnectionConfig);
dbWrapper.connect();
dbWrapper.fetchAll(sql_query, null, function (err, result) {
  if (!err) {
    console.log("Data came back from the DB.");
  } else {
    console.log("DB returned an error: %s", err);
  }

  dbWrapper.close(function (close_err) {
    if (close_err) {
      console.log("Error while disconnecting: %s", close_err);
    }
  });
});

config.js:

var config = {
  db:{
    host:"plop",
    database:"musicbrainz",
    username:"musicbrainz",
    password:"musicbrainz"
  },
}
module.exports = config;

嘿,mlaccetti,尝试连接到SQLite3数据库并运行测试时,我遇到类似的问题。我正在阅读有关使用DBWrapper的说明的教程,这就是我与您联系的原因。我的问题在这里: stackoverflow.com/q/35803874/1735836
Patricia

从那以后,Node-DBI一直被遗弃,并且不再受支持。
vitaly-t

2

一种解决方案可以使用pool如下客户端:

const { Pool } = require('pg');
var config = {
    user: 'foo', 
    database: 'my_db', 
    password: 'secret', 
    host: 'localhost', 
    port: 5432, 
    max: 10, // max number of clients in the pool
    idleTimeoutMillis: 30000
};
const pool = new Pool(config);
pool.on('error', function (err, client) {
    console.error('idle client error', err.message, err.stack);
});
pool.query('SELECT $1::int AS number', ['2'], function(err, res) {
    if(err) {
        return console.error('error running query', err);
    }
    console.log('number:', res.rows[0].number);
});

您可以在此资源上看到更多详细信息。


您没有使用“ config”。
LEMUEL ADANE 18/09/17

1

Slonik是Kuberchaun和Vitaly提出的答案的替代方法。

Slonik实施安全的连接处理;您创建一个连接池,并为您处理连接打开/处理。

import {
  createPool,
  sql
} from 'slonik';

const pool = createPool('postgres://user:password@host:port/database');

return pool.connect((connection) => {
  // You are now connected to the database.
  return connection.query(sql`SELECT foo()`);
})
  .then(() => {
    // You are no longer connected to the database.
  });

postgres://user:password@host:port/database 是您的连接字符串(或更典型地是一个连接URI或DSN)。

这种方法的好处是您的脚本可确保您永远不会意外离开挂起的连接。

使用Slonik的其他好处包括:


0

我们也可以使用postgresql-easy。它基于node-postgressqlutil构建注意: pg_connection.jsyour_handler.js在同一文件夹中。db.js位于config文件夹中。

pg_connection.js

const PgConnection = require('postgresql-easy');
const dbConfig = require('./config/db');
const pg = new PgConnection(dbConfig);
module.exports = pg;

./config/db.js

module.exports =  {
  database: 'your db',
  host: 'your host',
  port: 'your port',
  user: 'your user',
  password: 'your pwd',
}

your_handler.js

  const pg_conctn = require('./pg_connection');

  pg_conctn.getAll('your table')
    .then(res => {
         doResponseHandlingstuff();
      })
    .catch(e => {
         doErrorHandlingStuff()     
      })
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.