Cách tạo kết nối với Postgres qua Node.js


123

Tôi thấy mình đang cố gắng tạo cơ sở dữ liệu postgres, vì vậy tôi đã cài đặt postgres và khởi động một máy chủ initdb /usr/local/pgsql/data, sau đó tôi bắt đầu ví dụ đó postgres -D /usr/local/pgsql/databây giờ làm thế nào tôi có thể tương tác với nút này? Ví dụ, cái gì sẽ connectionstringlà, hoặc làm thế nào tôi có thể tìm ra nó là gì.

Câu trả lời:


313

Đây là một ví dụ tôi đã sử dụng để kết nối node.js với cơ sở dữ liệu Postgres của mình.

Giao diện trong node.js mà tôi đã sử dụng có thể được tìm thấy ở đây 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();
});

CẬP NHẬT: - query.onHàm hiện không được dùng nữa và do đó đoạn mã trên sẽ không hoạt động như dự định. Như một giải pháp cho cái nhìn này: - query.on không phải là một hàm


24
Bây giờ đó là loại ví dụ tôi muốn xem. Rõ ràng và bao gồm mã vừa đủ. Cảm ơn JustBob.
Stradas

1
Bạn đã thêm gì vào pg_hba.conf để cho phép các kết nối từ node.js? Cảm ơn
Marius

3
lưu trữ tất cả 0.0.0.0/0 md5 Mục này sẽ nếu tôi nhớ chính xác cho phép bất kỳ IP nào kết nối. Hãy nhớ rằng đây không phải là nút cụ thể, nhưng cụ thể là PostgreSQL. Ngoài ra trong postgresql.conf tôi có list_addresses = '*'. Đối với các thiết lập sản xuất, vui lòng đọc tài liệu thông qua để đảm bảo bạn không mở lỗ ở bất cứ đâu. Tôi sử dụng điều này trong thiết lập dev của mình vì vậy tôi ổn khi cho phép mọi máy kết nối.
Kuberchaun

1
Các tham số conString đánh vần là thiên tài, và chỉ những gì tôi đang tìm kiếm. Cảm ơn bạn!
nelsonenzo


33

Một cách tiếp cận hiện đại và đơn giản: pg-hứa :

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]);

Xem thêm: Cách khai báo chính xác mô-đun cơ sở dữ liệu của bạn .


Mặc dù liên kết này có thể trả lời câu hỏi, tốt hơn là bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo. Câu trả lời chỉ liên kết có thể trở nên không hợp lệ nếu trang được liên kết thay đổi.
arulmr

1
Trong một thế giới lý tưởng - vâng, tuy nhiên, câu trả lời được chấp nhận ở đây, như bạn có thể thấy ở trên - chỉ cần liên kết. Tương tự như vậy, sẽ là quá nhiều để tạo ra một bản tóm tắt từ thông tin mà liên kết cung cấp và xem xét rằng cả hai liên kết được cung cấp cho kho lưu trữ công khai của GitHub, khả năng chúng sẽ chết không nhiều hơn cơ hội để StackOverflow bị chết .
Vitaly-t

Có lẽ chỉ cần cung cấp một ví dụ đơn giản về việc sử dụng nó cho một cái gì đó rất cơ bản, chỉ nên chiếm một vài dòng nhưng sẽ đủ để không làm cho nó chỉ liên kết.
Qantas 94 Nặng

@ Qantas94Heavy, và tôi vừa làm, giữ nó khi bỏ phiếu xuống :)
Vitaly-t

@ Vitaly-t: Ai đó có thể đã gắn cờ bài đăng là "chất lượng rất thấp", điều này sẽ tự động tải xuống nếu bài đăng được chỉnh sửa hoặc xóa trước khi cờ được xử lý.
Qantas 94 Nặng

12

Chỉ cần thêm một tùy chọn khác - tôi sử dụng Node-DBI để kết nối với PG, nhưng cũng do khả năng nói chuyện với MySQL và sqlite. Node-DBI cũng bao gồm chức năng để xây dựng một câu lệnh chọn, thuận tiện cho việc thực hiện các công cụ động khi đang di chuyển.

Mẫu nhanh (sử dụng thông tin cấu hình được lưu trữ trong tệp khác):

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;

Này, mlaccetti, tôi có một vấn đề tương tự khi cố gắng kết nối và chạy thử nghiệm đối với cơ sở dữ liệu SQLite3. Tôi đang thực hiện một hướng dẫn với các hướng dẫn để sử dụng DBWrapper, đó là lý do tại sao tôi tiếp cận với bạn. Câu hỏi của tôi là ở đây: stackoverflow.com/q35383838/1735336
Patricia

Node-DBI đã bị bỏ rơi từ lâu và không còn được hỗ trợ.
Vitaly-t

2

Một giải pháp có thể được sử dụng poolcủa khách hàng như sau:

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

Bạn có thể xem thêm chi tiết về tài nguyên này .


bạn đã không sử dụng 'config'.
LEMUEL ADane

1

Slonik là một thay thế cho câu trả lời được đề xuất bởi Kuberchaun và Vitaly.

Slonik thực hiện xử lý kết nối an toàn ; bạn tạo một nhóm kết nối và việc mở / xử lý kết nối được xử lý cho bạn.

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 là chuỗi kết nối của bạn (hoặc chính xác hơn là URI kết nối hoặc DSN).

Lợi ích của phương pháp này là tập lệnh của bạn đảm bảo rằng bạn không bao giờ vô tình rời khỏi các kết nối treo.

Các lợi ích khác khi sử dụng Slonik bao gồm:


0

Chúng tôi cũng có thể sử dụng postgresql dễ dàng . Nó được xây dựng trên nút-postgressqlutil . Lưu ý: pg_connection.js & your_handler.js nằm trong cùng một thư mục. db.js nằm trong thư mục cấu hình được đặt.

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()     
      })
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.